From c0724e281f1e5394ab54d998740ea78c34f04776 Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+paul8711-code@users.noreply.github.com> Date: Fri, 5 Jun 2026 07:39:55 +0200 Subject: [PATCH 1/9] rename owner --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index c3d2ab3..88e4431 100644 --- a/LICENSE +++ b/LICENSE @@ -630,7 +630,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ion-mail Heavyweight CLI email client (in Rust) - Copyright (C) 2026 Paul8711gamezz (Paulprojects8711) + Copyright (C) 2026 Paul8711gamezz (Paul8711) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published From 4fc2da8385188bf3b80459fb176044e497ac4d38 Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+Paulprojects8711@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:28:57 +0200 Subject: [PATCH 2/9] chore: update dependencies --- Cargo.lock | 181 ++++++++++++++++++++++++++--------------------------- 1 file changed, 90 insertions(+), 91 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b1bb86..ff032cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -278,9 +278,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "block-buffer" @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.62" +version = "1.2.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" +checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f" dependencies = [ "find-msvc-tools", "jobserver", @@ -388,9 +388,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -637,7 +637,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "crossterm_winapi", "derive_more", "document-features", @@ -742,9 +742,9 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", @@ -1172,9 +1172,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -1217,9 +1217,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", @@ -1476,7 +1476,7 @@ dependencies = [ "minus", "native-tls", "oauth2", - "reqwest 0.13.3", + "reqwest 0.13.4", "serde", "serde_json", "shellexpand", @@ -1589,13 +1589,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.99" +version = "0.3.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -1688,9 +1687,9 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ "libc", ] @@ -1724,9 +1723,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.30" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" +checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a" [[package]] name = "lru-slab" @@ -1788,9 +1787,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "memoffset" @@ -1841,9 +1840,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "log", @@ -2001,11 +2000,11 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.80" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "cfg-if", "foreign-types", "libc", @@ -2032,9 +2031,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.116" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -2380,7 +2379,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", ] [[package]] @@ -2396,9 +2395,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.3" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ "aho-corasick", "memchr", @@ -2419,9 +2418,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -2465,9 +2464,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ "base64 0.22.1", "bytes", @@ -2538,7 +2537,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys", @@ -2562,9 +2561,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -2682,7 +2681,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -2819,9 +2818,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook" @@ -2884,15 +2883,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", "windows-sys 0.61.2", @@ -3000,7 +2999,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3192,9 +3191,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ "indexmap", "toml_datetime", @@ -3238,7 +3237,7 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "bytes", "futures-util", "http", @@ -3301,9 +3300,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "uds_windows" @@ -3336,9 +3335,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -3397,9 +3396,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.1" +version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" dependencies = [ "js-sys", "serde_core", @@ -3445,9 +3444,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen 0.57.1", ] @@ -3463,9 +3462,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.122" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" dependencies = [ "cfg-if", "once_cell", @@ -3476,9 +3475,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.72" +version = "0.4.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" dependencies = [ "js-sys", "wasm-bindgen", @@ -3486,9 +3485,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.122" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3496,9 +3495,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.122" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" dependencies = [ "bumpalo", "proc-macro2", @@ -3509,9 +3508,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.122" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" dependencies = [ "unicode-ident", ] @@ -3544,7 +3543,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags 2.13.0", "hashbrown 0.15.5", "indexmap", "semver", @@ -3552,9 +3551,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.99" +version = "0.3.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" dependencies = [ "js-sys", "wasm-bindgen", @@ -3931,7 +3930,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags 2.13.0", "indexmap", "log", "serde", @@ -3980,9 +3979,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -4003,9 +4002,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.15.0" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1" +checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" dependencies = [ "async-broadcast", "async-executor", @@ -4049,9 +4048,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.15.0" +version = "5.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff" +checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4075,18 +4074,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", @@ -4116,9 +4115,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" @@ -4161,9 +4160,9 @@ checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zvariant" -version = "5.11.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c1567a6ec68df868cbbfde844cfc6d81649fe5109a62b116b19fabd53e618ee" +checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" dependencies = [ "endi", "enumflags2", @@ -4175,9 +4174,9 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.11.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d5b780599bbde114e39d9a0799577fad1ced5105d38515745f7b3099d8ceda" +checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4188,9 +4187,9 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "3.3.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691" +checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" dependencies = [ "proc-macro2", "quote", From 6e090fd2945b866c206582658cff5f402941ed74 Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+Paulprojects8711@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:29:49 +0200 Subject: [PATCH 3/9] refactor: move config file and change error handling logic --- src/account.rs | 1287 ++++++++++++++++++++---------------------------- src/folder.rs | 215 ++++---- src/mail.rs | 872 ++++++++++++++------------------ src/main.rs | 78 ++- 4 files changed, 1017 insertions(+), 1435 deletions(-) diff --git a/src/account.rs b/src/account.rs index df99a68..1511c7e 100644 --- a/src/account.rs +++ b/src/account.rs @@ -68,122 +68,93 @@ pub fn auth(config: Config) -> imap::Session e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let mut password = match entry.get_password() { - Ok(p) => p, - Err(e) => { - eprintln!("Failed to get password: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let entry = Entry::new(APP_NAME, &use_account.id.to_string()).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + let mut password = entry.get_password().unwrap_or_else(|err| { + eprintln!("Failed to get password: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); password = if let Some(token_expiration) = use_account.token_expiration { - let stored_date = match DateTime::parse_from_rfc3339(&token_expiration) { - Ok(d) => d.with_timezone(&Utc), - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let stored_date = DateTime::parse_from_rfc3339(&token_expiration) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }) + .with_timezone(&Utc); let today = Utc::now(); if today >= stored_date { // relogin - let client_id_entry = match Entry::new(APP_NAME, &format!("{}.id", &use_account.id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let client_id = match client_id_entry.get_password() { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get Client Id: {}", e); + let client_id_entry = Entry::new(APP_NAME, &format!("{}.id", &use_account.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + let client_id = client_id_entry.get_password().unwrap_or_else(|err| { + eprintln!("Failed to get Client Id: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let domain = use_account.email.split("@").collect::>()[1]; - let config_entry = match reqwest::blocking::get(format!( + let config_entry = reqwest::blocking::get(format!( "https://raw.githubusercontent.com/Paulprojects8711/ion-mail-config/refs/heads/main/providers/{}.toml", domain - )) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get provider list: {}", e); + )).unwrap_or_else(|err| { + eprintln!("Failed to get provider list: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); let mail_config: MailConfig = if config_entry.status().is_success() { - let config_text = match config_entry.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match toml::from_str(&config_text) { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + let config_text = config_entry.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + toml::from_str(&config_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }) } else { eprintln!("Failed to get provider list"); keyring_core::unset_default_store(); process::exit(1); }; let refresh_token_entry = - match Entry::new(APP_NAME, &format!("{}.refresh_token", use_account.id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + Entry::new(APP_NAME, &format!("{}.refresh_token", use_account.id)).unwrap_or_else( + |err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }, + ); + let refresh_token: Option = refresh_token_entry.get_password().ok(); - let response = match reqwest::blocking::get(&mail_config.oidc) { - Ok(r) => r, - Err(e) => { - eprintln!("Failed to get OIDC Discovery Endpoints: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let response_text = match response.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let endpoints: Endpoints = match serde_json::from_str(&response_text) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let response = reqwest::blocking::get(&mail_config.oidc).unwrap_or_else(|err| { + eprintln!("Failed to get OIDC Discovery Endpoints: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let response_text = response.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + let endpoints: Endpoints = serde_json::from_str(&response_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let client = BasicClient::new(ClientId::new(client_id)) .set_auth_uri(AuthUrl::new(endpoints.authorization_endpoint).unwrap()) @@ -203,14 +174,12 @@ pub fn auth(config: Config) -> imap::Session d, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let token_result = details.request(&http_client).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + if let Some(expires_in) = token_result.expires_in() { let expire_date = (today + expires_in).to_rfc3339(); use_account.token_expiration = Some(expire_date); @@ -220,54 +189,45 @@ pub fn auth(config: Config) -> imap::Session toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let toml_p = dirs::home_dir().ok_or_else(|| { - eprintln!("Could not find home directory"); + let toml_output = toml::to_string(&_config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); process::exit(1); }); - let mut toml_path_unwrap = toml_p.unwrap(); - - toml_path_unwrap.push(".ion-mail"); - - toml_path_unwrap.push("config.toml"); - - let toml_path: &str = toml_path_unwrap.to_str().unwrap(); - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); + let toml_p = dirs::config_local_dir() + .unwrap_or_else(|| { + eprintln!("Could not find config directory"); process::exit(1); - } - } + }) + .join("ion-mail") + .join("config.toml"); + + let toml_path: &str = toml_p.to_str().unwrap(); + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } if let Some(refresh_token) = token_result.refresh_token() { - match refresh_token_entry.set_password(refresh_token.secret()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + refresh_token_entry + .set_password(refresh_token.secret()) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); } // save password - match entry.set_password(token_result.access_token().secret()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + entry + .set_password(token_result.access_token().secret()) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + token_result.access_token().clone().into_secret() } else { let mut details = client.exchange_device_code(); @@ -278,14 +238,11 @@ pub fn auth(config: Config) -> imap::Session d, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + details.request(&http_client).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); println!( "To authenticate, open this URL in your browser:\n{}\nand enter the code: {}", @@ -293,17 +250,15 @@ pub fn auth(config: Config) -> imap::Session t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if let Some(expires_in) = token_result.expires_in() { let expire_date = (today + expires_in).to_rfc3339(); use_account.token_expiration = Some(expire_date); @@ -317,54 +272,45 @@ pub fn auth(config: Config) -> imap::Session toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let toml_p = dirs::home_dir().ok_or_else(|| { - eprintln!("Could not find home directory"); + let toml_output = toml::to_string(&_config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); process::exit(1); }); - let mut toml_path_unwrap = toml_p.unwrap(); - - toml_path_unwrap.push(".ion-mail"); - - toml_path_unwrap.push("config.toml"); - - let toml_path: &str = toml_path_unwrap.to_str().unwrap(); - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); + let toml_p = dirs::config_local_dir() + .unwrap_or_else(|| { + eprintln!("Could not find config directory"); process::exit(1); - } - } + }) + .join("ion-mail") + .join("config.toml"); + + let toml_path: &str = toml_p.to_str().unwrap(); + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } if let Some(refresh_token) = token_result.refresh_token() { - match refresh_token_entry.set_password(refresh_token.secret()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + refresh_token_entry + .set_password(refresh_token.secret()) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); } // save password - match entry.set_password(token_result.access_token().secret()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + entry + .set_password(token_result.access_token().secret()) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + token_result.access_token().clone().into_secret() } } else { @@ -377,31 +323,27 @@ pub fn auth(config: Config) -> imap::Session c, - Err(e) => { - eprintln!("Failed to connect via SSL/TLS: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + ) + .unwrap_or_else(|err| { + eprintln!("Failed to connect via SSL/TLS: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }) } else if use_account.imap.security == "STARTTLS" { - match imap::connect_starttls( + imap::connect_starttls( (use_account.imap.host.clone(), use_account.imap.port), &use_account.imap.host, &tls, - ) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to connect via STARTTLS: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + ) + .unwrap_or_else(|err| { + eprintln!("Failed to connect via STARTTLS: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }) } else { eprintln!("Security type not recognized"); keyring_core::unset_default_store(); @@ -414,23 +356,21 @@ pub fn auth(config: Config) -> imap::Session s, - Err((e, _orig_client)) => { - eprintln!("Login failed: {}", e); + client + .authenticate("XOAUTH2", &auth) + .unwrap_or_else(|(err, _orig_client)| { + eprintln!("Login failed: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }) } else { - match client.login(use_account.email, password) { - Ok(s) => s, - Err((e, _orig_client)) => { - eprintln!("Login failed: {}", e); + client + .login(use_account.email, password) + .unwrap_or_else(|(err, _orig_client)| { + eprintln!("Login failed: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }) } } @@ -457,36 +397,30 @@ pub fn add(toml_path: &str, old_config: Config) { let domain = mail.split("@").collect::>()[1]; - let config_entry = match reqwest::blocking::get(format!( + let config_entry = reqwest::blocking::get(format!( "https://raw.githubusercontent.com/Paulprojects8711/ion-mail-config/refs/heads/main/providers/{}.toml", domain - )) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get provider list: {}", e); + )).unwrap_or_else(|err| { + eprintln!("Failed to get provider list: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + let mut refresh_token = None; let mut token_expiration: Option = None; let (mut new_account, client_id, password) = if config_entry.status().is_success() { - let config_text = match config_entry.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let mail_config: MailConfig = match toml::from_str(&config_text) { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let config_text = config_entry.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let mail_config: MailConfig = toml::from_str(&config_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + let smtp_host = mail_config.smtp.host; let smtp_port = mail_config.smtp.port; let smtp_security = mail_config.smtp.security; @@ -501,30 +435,24 @@ pub fn add(toml_path: &str, old_config: Config) { .unwrap(); let final_client_id = Some(client_id.clone()); - let response = match reqwest::blocking::get(&mail_config.oidc) { - Ok(r) => r, - Err(e) => { - eprintln!("Failed to get OIDC Discovery Endpoints: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let response_text = match response.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let endpoints: Endpoints = match serde_json::from_str(&response_text) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let response = reqwest::blocking::get(&mail_config.oidc).unwrap_or_else(|err| { + eprintln!("Failed to get OIDC Discovery Endpoints: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let response_text = response.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let endpoints: Endpoints = serde_json::from_str(&response_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + let client = BasicClient::new(ClientId::new(client_id)) .set_auth_uri(AuthUrl::new(endpoints.authorization_endpoint).unwrap()) .set_token_uri(TokenUrl::new(endpoints.token_endpoint).unwrap()) @@ -540,15 +468,12 @@ pub fn add(toml_path: &str, old_config: Config) { for scope in &scopes { details = details.add_scope(Scope::new(scope.to_string())); } - let final_details: StandardDeviceAuthorizationResponse = match details.request(&http_client) - { - Ok(d) => d, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let final_details: StandardDeviceAuthorizationResponse = + details.request(&http_client).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); println!( "To authenticate, open this URL in your browser:\n{}\nand enter the code: {}", @@ -556,18 +481,15 @@ pub fn add(toml_path: &str, old_config: Config) { final_details.user_code().secret() ); - let token_result = match client.exchange_device_access_token(&final_details).request( - &http_client, - std::thread::sleep, - None, - ) { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let token_result = client + .exchange_device_access_token(&final_details) + .request(&http_client, std::thread::sleep, None) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if let Some(expires_in) = token_result.expires_in() { let expire_date = (Utc::now() + expires_in).to_rfc3339(); token_expiration = Some(expire_date); @@ -744,27 +666,19 @@ pub fn add(toml_path: &str, old_config: Config) { let tls = native_tls::TlsConnector::builder().build().unwrap(); let client = if imap_security == "SSL" || imap_security == "TLS" { - match imap::connect((imap_host.clone(), imap_port), &imap_host, &tls) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to connect via SSL/TLS: {}", e); + imap::connect((imap_host.clone(), imap_port), &imap_host, &tls) + .unwrap_or_else(|err| { + eprintln!("Failed to connect via SSL/TLS: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }) } else if imap_security == "STARTTLS" { - match imap::connect_starttls( - (imap_host.clone(), imap_port), - &imap_host, - &tls, - ) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to connect via STARTTLS: {}", e); + imap::connect_starttls((imap_host.clone(), imap_port), &imap_host, &tls) + .unwrap_or_else(|err| { + eprintln!("Failed to connect via STARTTLS: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }) } else { eprintln!("Security type not recognized"); keyring_core::unset_default_store(); @@ -780,63 +694,50 @@ pub fn add(toml_path: &str, old_config: Config) { .unwrap() } else { let client_id = client_id.clone().expect("Client ID should exist"); - let config_entry = match reqwest::blocking::get(format!( + let config_entry = reqwest::blocking::get(format!( "https://raw.githubusercontent.com/Paulprojects8711/ion-mail-config/refs/heads/main/providers/{}.toml", domain - )) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get provider list: {}", e); + )).unwrap_or_else(|err| { + eprintln!("Failed to get provider list: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + let mail_config: MailConfig = if config_entry.status().is_success() { - let config_text = match config_entry.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match toml::from_str(&config_text) { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } - } else { - eprintln!("Failed to get provider list"); - keyring_core::unset_default_store(); - process::exit(1); - }; - let response = match reqwest::blocking::get(&mail_config.oidc) { - Ok(r) => r, - Err(e) => { - eprintln!("Failed to get OIDC Discovery Endpoints: {}", e); + let config_text = config_entry.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; - let response_text = match response.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let endpoints: Endpoints = match serde_json::from_str(&response_text) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + }); + + toml::from_str(&config_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } + }) + } else { + eprintln!("Failed to get provider list"); + keyring_core::unset_default_store(); + process::exit(1); }; + let response = reqwest::blocking::get(&mail_config.oidc).unwrap_or_else(|err| { + eprintln!("Failed to get OIDC Discovery Endpoints: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let response_text = response.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let endpoints: Endpoints = serde_json::from_str(&response_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + let client = BasicClient::new(ClientId::new(client_id)) .set_auth_uri(AuthUrl::new(endpoints.authorization_endpoint).unwrap()) .set_token_uri(TokenUrl::new(endpoints.token_endpoint).unwrap()) @@ -856,14 +757,11 @@ pub fn add(toml_path: &str, old_config: Config) { } } let final_details: StandardDeviceAuthorizationResponse = - match details.request(&http_client) { - Ok(d) => d, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + details.request(&http_client).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); println!( "To authenticate, open this URL in your browser:\n{}\nand enter the code: {}", @@ -871,18 +769,15 @@ pub fn add(toml_path: &str, old_config: Config) { final_details.user_code().secret() ); - let token_result = match client.exchange_device_access_token(&final_details).request( - &http_client, - std::thread::sleep, - None, - ) { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let token_result = client + .exchange_device_access_token(&final_details) + .request(&http_client, std::thread::sleep, None) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if Confirm::with_theme(&ColorfulTheme::default()) .with_prompt("Entry does not yet exist in database. Do you want to add it?") .default(true) @@ -997,75 +892,61 @@ pub fn add(toml_path: &str, old_config: Config) { _config.accounts.push(new_account); - let toml_output = match toml::to_string(&_config) { - Ok(toml) => toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + let toml_output = toml::to_string(&_config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let entry = Entry::new(APP_NAME, &new_id.to_string()).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + entry.set_password(&password).unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - let entry = match Entry::new(APP_NAME, &new_id.to_string()) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match entry.set_password(&password) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; if let Some(refresh_token) = refresh_token { - let refresh_token_entry = match Entry::new(APP_NAME, &format!("{}.refresh_token", &new_id)) - { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let refresh_token_entry = Entry::new(APP_NAME, &format!("{}.refresh_token", &new_id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; - match refresh_token_entry.set_password(&refresh_token) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + }); + + refresh_token_entry + .set_password(&refresh_token) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); } if let Some(client_id) = client_id { - let client_id_entry = match Entry::new(APP_NAME, &format!("{}.id", &new_id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let client_id_entry = + Entry::new(APP_NAME, &format!("{}.id", &new_id)).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; - match client_id_entry.set_password(&client_id) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get Client Id: {}", e); + }); + + client_id_entry + .set_password(&client_id) + .unwrap_or_else(|err| { + eprintln!("Failed to get Client Id: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }); } } @@ -1127,22 +1008,17 @@ pub fn switch(toml_path: &str, config: Config, account: String) { process::exit(1); } } - let toml_output = match toml::to_string(&_config) { - Ok(toml) => toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + let toml_output = toml::to_string(&_config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); println!("Successfully switched to account {}", account); } @@ -1260,22 +1136,17 @@ pub fn edit(toml_path: &str, old_config: Config, account: Option) { } } - let entry = match Entry::new(APP_NAME, &account_edit.id.to_string()) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let mut password = match entry.get_password() { - Ok(p) => p, - Err(e) => { - eprintln!("Failed to get password: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let entry = Entry::new(APP_NAME, &account_edit.id.to_string()).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let mut password = entry.get_password().unwrap_or_else(|err| { + eprintln!("Failed to get password: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let security = vec!["SSL".to_string(), "STARTTLS".to_string()]; let mut refresh_token: Option = None; @@ -1314,31 +1185,27 @@ pub fn edit(toml_path: &str, old_config: Config, account: Option) { let client = if account_edit.imap.security == "SSL" || account_edit.imap.security == "TLS" { - match imap::connect( + imap::connect( (account_edit.imap.host.clone(), account_edit.imap.port), &account_edit.imap.host, &tls, - ) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to connect via SSL/TLS: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + ) + .unwrap_or_else(|err| { + eprintln!("Failed to connect via SSL/TLS: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }) } else if account_edit.imap.security == "STARTTLS" { - match imap::connect_starttls( + imap::connect_starttls( (account_edit.imap.host.clone(), account_edit.imap.port), &account_edit.imap.host, &tls, - ) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to connect via STARTTLS: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + ) + .unwrap_or_else(|err| { + eprintln!("Failed to connect via STARTTLS: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }) } else { eprintln!("Security type not recognized"); keyring_core::unset_default_store(); @@ -1354,80 +1221,65 @@ pub fn edit(toml_path: &str, old_config: Config, account: Option) { .unwrap() } else { let domain = account_edit.email.split("@").collect::>()[1]; - let client_id_entry = - match Entry::new(APP_NAME, &format!("{}.id", &account_edit.id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let client_id = match client_id_entry.get_password() { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get Client Id: {}", e); + let client_id_entry = Entry::new(APP_NAME, &format!("{}.id", &account_edit.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; - let config_entry = match reqwest::blocking::get(format!( + }); + + let client_id = client_id_entry.get_password().unwrap_or_else(|err| { + eprintln!("Failed to get Client Id: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let config_entry = reqwest::blocking::get(format!( "https://raw.githubusercontent.com/Paulprojects8711/ion-mail-config/refs/heads/main/providers/{}.toml", domain - )) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get provider list: {}", e); + )).unwrap_or_else(|err| { + eprintln!("Failed to get provider list: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + let mail_config: MailConfig = if config_entry.status().is_success() { - let config_text = match config_entry.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match toml::from_str(&config_text) { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + let config_text = config_entry.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + toml::from_str(&config_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }) } else { eprintln!("Failed to get provider list"); keyring_core::unset_default_store(); process::exit(1); }; - let response = match reqwest::blocking::get(&mail_config.oidc) { - Ok(r) => r, - Err(e) => { - eprintln!("Failed to get OIDC Discovery Endpoints: {}", e); + let response = + reqwest::blocking::get(&mail_config.oidc).unwrap_or_else(|err| { + eprintln!("Failed to get OIDC Discovery Endpoints: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; - let response_text = match response.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let endpoints: Endpoints = match serde_json::from_str(&response_text) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + }); + + let response_text = response.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let endpoints: Endpoints = + serde_json::from_str(&response_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + let client = BasicClient::new(ClientId::new(client_id)) .set_auth_uri(AuthUrl::new(endpoints.authorization_endpoint).unwrap()) .set_token_uri(TokenUrl::new(endpoints.token_endpoint).unwrap()) @@ -1448,14 +1300,11 @@ pub fn edit(toml_path: &str, old_config: Config, account: Option) { } } let final_details: StandardDeviceAuthorizationResponse = - match details.request(&http_client) { - Ok(d) => d, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + details.request(&http_client).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); println!( "To authenticate, open this URL in your browser:\n{}\nand enter the code: {}", @@ -1463,17 +1312,15 @@ pub fn edit(toml_path: &str, old_config: Config, account: Option) { final_details.user_code().secret() ); - let token_result = match client + let token_result = client .exchange_device_access_token(&final_details) .request(&http_client, std::thread::sleep, None) - { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if let Some(expires_in) = token_result.expires_in() { let expire_date = (Utc::now() + expires_in).to_rfc3339(); account_edit.token_expiration = Some(expire_date); @@ -1578,101 +1425,79 @@ pub fn edit(toml_path: &str, old_config: Config, account: Option) { } 4 => { config.accounts.push(account_edit.clone()); - let toml_output = match toml::to_string(&config) { - Ok(toml) => toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let toml_output = toml::to_string(&config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + entry.set_password(password.as_str()).unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - match entry.set_password(password.as_str()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } if let Some(refresh_token) = refresh_token { - let refresh_token_entry = match Entry::new( - APP_NAME, - &format!("{}.refresh_token", &account_edit.id), - ) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match refresh_token_entry.set_password(&refresh_token) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + let refresh_token_entry = + Entry::new(APP_NAME, &format!("{}.refresh_token", &account_edit.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + refresh_token_entry + .set_password(&refresh_token) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); } break; } 5 => { config.accounts.push(account_edit.clone()); - let toml_output = match toml::to_string(&config) { - Ok(toml) => toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let toml_output = toml::to_string(&config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + entry.set_password(password.as_str()).unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - match entry.set_password(password.as_str()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } if let Some(ref refresh_token) = refresh_token { - let refresh_token_entry = match Entry::new( - APP_NAME, - &format!("{}.refresh_token", &account_edit.id), - ) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match refresh_token_entry.set_password(refresh_token) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + let refresh_token_entry = + Entry::new(APP_NAME, &format!("{}.refresh_token", &account_edit.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + refresh_token_entry + .set_password(refresh_token) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); } } _ => { @@ -1710,49 +1535,40 @@ pub fn logout(toml_path: &str, old_config: Config, account: Option) { for acc in old_config.accounts { if acc.id == id { found = true; - let entry = match Entry::new(APP_NAME, &id.to_string()) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match entry.delete_credential() { - Ok(_) => {} - Err(e) => { - eprintln!("Error when deleting credential: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + let entry = Entry::new(APP_NAME, &id.to_string()).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + entry.delete_credential().unwrap_or_else(|err| { + eprintln!("Error when deleting credential: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + if acc.oidc.is_some() { - let client_id_entry = match Entry::new(APP_NAME, &format!("{}.id", &id)) - { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let client_id_entry = Entry::new(APP_NAME, &format!("{}.id", &id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; - match client_id_entry.delete_credential() { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get Client Id: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + }); + + client_id_entry.delete_credential().unwrap_or_else(|err| { + eprintln!("Failed to get Client Id: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + let refresh_token_entry = - match Entry::new(APP_NAME, &format!("{}.refresh_token", &id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + Entry::new(APP_NAME, &format!("{}.refresh_token", &id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if refresh_token_entry.delete_credential().is_ok() {}; } } else { @@ -1763,49 +1579,41 @@ pub fn logout(toml_path: &str, old_config: Config, account: Option) { for acc in old_config.accounts { if acc.email == account { found = true; - let entry = match Entry::new(APP_NAME, &acc.id.to_string()) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match entry.delete_credential() { - Ok(_) => {} - Err(e) => { - eprintln!("Error when deleting credential: {}", e); + let entry = + Entry::new(APP_NAME, &acc.id.to_string()).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }); + + entry.delete_credential().unwrap_or_else(|err| { + eprintln!("Error when deleting credential: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + if acc.oidc.is_some() { - let client_id_entry = - match Entry::new(APP_NAME, &format!("{}.id", &acc.id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match client_id_entry.delete_credential() { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to delete Client Id: {}", e); + let client_id_entry = Entry::new(APP_NAME, &format!("{}.id", &acc.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + + client_id_entry.delete_credential().unwrap_or_else(|err| { + eprintln!("Failed to delete Client Id: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + let refresh_token_entry = - match Entry::new(APP_NAME, &format!("{}.refresh_token", &acc.id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + Entry::new(APP_NAME, &format!("{}.refresh_token", &acc.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if refresh_token_entry.delete_credential().is_ok() {}; } } else { @@ -1820,49 +1628,40 @@ pub fn logout(toml_path: &str, old_config: Config, account: Option) { for acc in old_config.accounts { if acc.active { found = true; - let entry = match Entry::new(APP_NAME, &acc.id.to_string()) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match entry.delete_credential() { - Ok(_) => {} - Err(e) => { - eprintln!("Error when deleting credential: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + let entry = Entry::new(APP_NAME, &acc.id.to_string()).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + entry.delete_credential().unwrap_or_else(|err| { + eprintln!("Error when deleting credential: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + if acc.oidc.is_some() { - let client_id_entry = match Entry::new(APP_NAME, &format!("{}.id", &acc.id)) - { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match client_id_entry.delete_credential() { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get Client Id: {}", e); + let client_id_entry = Entry::new(APP_NAME, &format!("{}.id", &acc.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + + client_id_entry.delete_credential().unwrap_or_else(|err| { + eprintln!("Failed to get Client Id: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + let refresh_token_entry = - match Entry::new(APP_NAME, &format!("{}.refresh_token", &acc.id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + Entry::new(APP_NAME, &format!("{}.refresh_token", &acc.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if refresh_token_entry.delete_credential().is_ok() {}; } } else { @@ -1881,22 +1680,18 @@ pub fn logout(toml_path: &str, old_config: Config, account: Option) { } if found { - let toml_output = match toml::to_string(&config) { - Ok(toml) => toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + let toml_output = toml::to_string(&config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + println!("Logout successful"); } } diff --git a/src/folder.rs b/src/folder.rs index 7972198..a4eb0cc 100644 --- a/src/folder.rs +++ b/src/folder.rs @@ -7,14 +7,11 @@ use std::process; pub fn list(config: Config, stats: bool) { let mut imap_session = auth(config); - let mailboxes = match imap_session.list(None, Some("*")) { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let mailboxes = imap_session.list(None, Some("*")).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let mut msgs: Vec<(u32, String)> = Vec::new(); @@ -24,18 +21,16 @@ pub fn list(config: Config, stats: bool) { .attributes() .contains(&imap::types::NameAttribute::NoSelect) { - let msg_cnt = match imap_session.examine(mailbox.name()) { - Ok(cnt) => cnt, - Err(e) => { - eprintln!( - "Failed to retrieve total messages for folder {}: {}", - mailbox.name(), - e - ); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let msg_cnt = imap_session.examine(mailbox.name()).unwrap_or_else(|err| { + eprintln!( + "Failed to retrieve total messages for folder {}: {}", + mailbox.name(), + err + ); + keyring_core::unset_default_store(); + process::exit(1); + }); + msgs.push((msg_cnt.exists, mailbox.name().to_string())); } } else { @@ -51,34 +46,27 @@ pub fn list(config: Config, stats: bool) { } } - match imap_session.logout() { - Ok(_) => {} - Err(e) => { - eprintln!("Logout failed, ignoring... ({})", e); - } - }; + imap_session.logout().unwrap_or_else(|err| { + eprintln!("Logout failed, ignoring... ({})", err); + }); } pub fn view(config: Config, folder: String, page_size: usize) { let mut imap_session = auth(config.clone()); - match imap_session.select(&folder) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to select folder: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + imap_session.select(&folder).unwrap_or_else(|err| { + eprintln!("Failed to select folder: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - let mails = match imap_session.fetch("1:*", "(BODY.PEEK[HEADER])") { - Ok(m) => m, - Err(e) => { - eprintln!("Failed to fetch messages: {}", e); + let mails = imap_session + .fetch("1:*", "(BODY.PEEK[HEADER])") + .unwrap_or_else(|err| { + eprintln!("Failed to fetch messages: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); let mut current_id = 0; @@ -86,14 +74,12 @@ pub fn view(config: Config, folder: String, page_size: usize) { for mail in mails.iter().rev() { if let Some(header_bytes) = mail.header() { - let (parsed_headers, _) = match mailparse::parse_headers(header_bytes) { - Ok(p) => p, - Err(e) => { - eprintln!("Failed to parse headers: {}", e); + let (parsed_headers, _) = + mailparse::parse_headers(header_bytes).unwrap_or_else(|err| { + eprintln!("Failed to parse headers: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); let mut subject = String::new(); let mut from = String::new(); @@ -111,14 +97,13 @@ pub fn view(config: Config, folder: String, page_size: usize) { } } - let parsed_date = match DateTime::parse_from_rfc2822(&date) { - Ok(p) => p.with_timezone(&Local), - Err(e) => { - eprintln!("Failed to parse date: {}", e); + let parsed_date = DateTime::parse_from_rfc2822(&date) + .unwrap_or_else(|err| { + eprintln!("Failed to parse date: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }) + .with_timezone(&Local); messages.push(format!( "[{:03}] {} | {} | {}", @@ -132,12 +117,9 @@ pub fn view(config: Config, folder: String, page_size: usize) { } } - match imap_session.logout() { - Ok(_) => {} - Err(e) => { - eprintln!("Logout failed, ignoring... ({})", e); - } - }; + imap_session.logout().unwrap_or_else(|err| { + eprintln!("Logout failed, ignoring... ({})", err); + }); if !messages.is_empty() { let selection = Select::with_theme(&ColorfulTheme::default()) @@ -149,14 +131,12 @@ pub fn view(config: Config, folder: String, page_size: usize) { .unwrap(); if let Some(selection) = selection { - let s = match selection.try_into() { - Ok(s) => s, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let s = selection.try_into().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + read(config, folder, s); } } else { @@ -167,14 +147,11 @@ pub fn view(config: Config, folder: String, page_size: usize) { pub fn create(config: Config, name: String, parents: bool) { let mut imap_session = auth(config); - let mailboxes = match imap_session.list(None, Some("*")) { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let mailboxes = imap_session.list(None, Some("*")).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let delimiter = mailboxes[0].delimiter().unwrap(); @@ -202,12 +179,9 @@ pub fn create(config: Config, name: String, parents: bool) { } } - match imap_session.logout() { - Ok(_) => {} - Err(e) => { - eprintln!("Logout failed, ignoring... ({})", e); - } - } + imap_session.logout().unwrap_or_else(|err| { + eprintln!("Logout failed, ignoring... ({})", err); + }); } pub fn delete(config: Config, names: Vec, recursive: bool, yes: bool) { @@ -228,14 +202,11 @@ pub fn delete(config: Config, names: Vec, recursive: bool, yes: bool) { if confirmation { if recursive { - let mailboxes = match imap_session.list(None, Some("*")) { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let mailboxes = imap_session.list(None, Some("*")).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let mut del_mailboxes = Vec::new(); @@ -273,12 +244,9 @@ pub fn delete(config: Config, names: Vec, recursive: bool, yes: bool) { } } - match imap_session.logout() { - Ok(_) => {} - Err(e) => { - eprintln!("Logout failed, ignoring... ({})", e); - } - } + imap_session.logout().unwrap_or_else(|err| { + eprintln!("Logout failed, ignoring... ({})", err); + }); } pub fn empty(config: Config, name: String) { @@ -292,58 +260,45 @@ pub fn empty(config: Config, name: String) { { let mut imap_session = auth(config); - match imap_session.select(&name) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to select folder: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + imap_session.select(&name).unwrap_or_else(|err| { + eprintln!("Failed to select folder: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - let search_results = match imap_session.uid_search("ALL") { - Ok(s) => s, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let search_results = imap_session.uid_search("ALL").unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); if !search_results.is_empty() { let uid_list: Vec = search_results.iter().map(|id| id.to_string()).collect(); let uid_set = uid_list.join(","); - match imap_session.uid_store(&uid_set, "FLAGS (\\Deleted)") { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); + imap_session + .uid_store(&uid_set, "FLAGS (\\Deleted)") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }); // store doesnt work on some servers - match imap_session.expunge() { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + imap_session.expunge().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); println!("Folder {} emptied", name); } else { println!("Folder {} is already empty", name); } - match imap_session.logout() { - Ok(_) => {} - Err(e) => { - eprintln!("Logout failed, ignoring... ({})", e); - } - } + imap_session.logout().unwrap_or_else(|err| { + eprintln!("Logout failed, ignoring... ({})", err); + }); } } diff --git a/src/mail.rs b/src/mail.rs index 89fbeda..364ac3f 100644 --- a/src/mail.rs +++ b/src/mail.rs @@ -64,14 +64,12 @@ pub fn send( process::exit(0); } - let email_str = match use_account.email.as_str().parse() { - Ok(s) => s, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let email_str = use_account.email.as_str().parse().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + // also have to do like all checks and if only some are done still open interactively let mail_components = if let Some(ref to) = to && let Some(ref subject) = subject @@ -154,17 +152,15 @@ pub fn send( let body = if let Some(ref body) = body { body.to_string() } else { - let edited = match Editor::new().edit("Enter the body of the email") { - Ok(t) => t, - Err(e) => { + let edited = Editor::new().edit("Enter the body of the email").unwrap_or_else(|err| { eprintln!( "Failed to open Editor: ({}), Maybe the EDITOR environment variable is not set?", - e + err ); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if let Some(body) = edited { body } else { @@ -259,14 +255,12 @@ pub fn send( let mut message = Message::builder().from(Mailbox::new(None, email_str)); for i in to { - let current_to = match i.as_str().parse() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let current_to = i.as_str().parse().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + message = message.to(Mailbox::new(None, current_to)); } @@ -287,14 +281,12 @@ pub fn send( let guess = mime_guess::from_path(attachment.as_path()).first_or_octet_stream(); let content_type = ContentType::parse(&format!("{}/{}", guess.type_(), guess.subtype())).unwrap(); - let filebody = match fs::read(attachment.as_path()) { - Ok(b) => b, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let filebody = fs::read(attachment.as_path()).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + if let Some(name) = name { let name_str = name.to_str(); if let Some(name_str) = name_str { @@ -317,131 +309,104 @@ pub fn send( multipart = multipart.singlepart(attachment); } - let final_message = match message.multipart(multipart) { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let final_message = message.multipart(multipart).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - let entry = match Entry::new(APP_NAME, &use_account.id.to_string()) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let mut password = match entry.get_password() { - Ok(p) => p, - Err(e) => { - eprintln!("Failed to get password: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let entry = Entry::new(APP_NAME, &use_account.id.to_string()).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let mut password = entry.get_password().unwrap_or_else(|err| { + eprintln!("Failed to get password: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); password = if let Some(token_expiration) = use_account.token_expiration { - let stored_date = match DateTime::parse_from_rfc3339(&token_expiration) { - Ok(d) => d.with_timezone(&Utc), - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let stored_date = DateTime::parse_from_rfc3339(&token_expiration) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }) + .with_timezone(&Utc); let today = Utc::now(); if today >= stored_date { // relogin - let client_id_entry = match Entry::new(APP_NAME, &format!("{}.id", &use_account.id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let client_id = match client_id_entry.get_password() { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get Client Id: {}", e); + let client_id_entry = Entry::new(APP_NAME, &format!("{}.id", &use_account.id)) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + + let client_id = client_id_entry.get_password().unwrap_or_else(|err| { + eprintln!("Failed to get Client Id: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let domain = use_account.email.split("@").collect::>()[1]; - let config_entry = match reqwest::blocking::get(format!( + let config_entry = reqwest::blocking::get(format!( "https://raw.githubusercontent.com/Paulprojects8711/ion-mail-config/refs/heads/main/providers/{}.toml", domain - )) { - Ok(c) => c, - Err(e) => { - eprintln!("Failed to get provider list: {}", e); + )).unwrap_or_else(|err| { + eprintln!("Failed to get provider list: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + let mail_config: MailConfig = if config_entry.status().is_success() { - let config_text = match config_entry.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - match toml::from_str(&config_text) { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + let config_text = config_entry.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + toml::from_str(&config_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }) } else { eprintln!("Failed to get provider list"); keyring_core::unset_default_store(); process::exit(1); }; let refresh_token_entry = - match Entry::new(APP_NAME, &format!("{}.refresh_token", use_account.id)) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + Entry::new(APP_NAME, &format!("{}.refresh_token", use_account.id)).unwrap_or_else( + |err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }, + ); + let refresh_token: Option = refresh_token_entry.get_password().ok(); - let response = match reqwest::blocking::get(&mail_config.oidc) { - Ok(r) => r, - Err(e) => { - eprintln!("Failed to get OIDC Discovery Endpoints: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let response_text = match response.text() { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let endpoints: Endpoints = match serde_json::from_str(&response_text) { - Ok(e) => e, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let response = reqwest::blocking::get(&mail_config.oidc).unwrap_or_else(|err| { + eprintln!("Failed to get OIDC Discovery Endpoints: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let response_text = response.text().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + let endpoints: Endpoints = serde_json::from_str(&response_text).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let client = BasicClient::new(ClientId::new(client_id)) .set_auth_uri(AuthUrl::new(endpoints.authorization_endpoint).unwrap()) @@ -461,14 +426,12 @@ pub fn send( details = details.add_scope(Scope::new(scope.to_string())); } } - let token_result = match details.request(&http_client) { - Ok(d) => d, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let token_result = details.request(&http_client).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + if let Some(expires_in) = token_result.expires_in() { let expire_date = (today + expires_in).to_rfc3339(); use_account.token_expiration = Some(expire_date); @@ -482,54 +445,45 @@ pub fn send( _config.accounts.push(use_account.clone()); } } - let toml_output = match toml::to_string(&_config) { - Ok(toml) => toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let toml_p = dirs::home_dir().ok_or_else(|| { - eprintln!("Could not find home directory"); + let toml_output = toml::to_string(&_config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); process::exit(1); }); - let mut toml_path_unwrap = toml_p.unwrap(); - - toml_path_unwrap.push(".ion-mail"); - - toml_path_unwrap.push("config.toml"); - - let toml_path: &str = toml_path_unwrap.to_str().unwrap(); - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); + let toml_p = dirs::config_local_dir() + .unwrap_or_else(|| { + eprintln!("Could not find home directory"); process::exit(1); - } - } + }) + .join("ion-mail") + .join("config.toml"); + + let toml_path: &str = toml_p.to_str().unwrap(); + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } if let Some(refresh_token) = token_result.refresh_token() { - match refresh_token_entry.set_password(refresh_token.secret()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + refresh_token_entry + .set_password(refresh_token.secret()) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); } // save password - match entry.set_password(token_result.access_token().secret()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + entry + .set_password(token_result.access_token().secret()) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + token_result.access_token().clone().into_secret() } else { let mut details = client.exchange_device_code(); @@ -540,14 +494,11 @@ pub fn send( } } let final_details: StandardDeviceAuthorizationResponse = - match details.request(&http_client) { - Ok(d) => d, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + details.request(&http_client).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); println!( "To authenticate, open this URL in your browser:\n{}\nand enter the code: {}", @@ -555,17 +506,15 @@ pub fn send( final_details.user_code().secret() ); - let token_result = match client + let token_result = client .exchange_device_access_token(&final_details) .request(&http_client, std::thread::sleep, None) - { - Ok(t) => t, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if let Some(expires_in) = token_result.expires_in() { let expire_date = (today + expires_in).to_rfc3339(); use_account.token_expiration = Some(expire_date); @@ -579,54 +528,45 @@ pub fn send( _config.accounts.push(use_account.clone()); } } - let toml_output = match toml::to_string(&_config) { - Ok(toml) => toml, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - let toml_p = dirs::home_dir().ok_or_else(|| { - eprintln!("Could not find home directory"); + let toml_output = toml::to_string(&_config).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); process::exit(1); }); - let mut toml_path_unwrap = toml_p.unwrap(); - - toml_path_unwrap.push(".ion-mail"); - - toml_path_unwrap.push("config.toml"); - - let toml_path: &str = toml_path_unwrap.to_str().unwrap(); - match fs::write(toml_path, toml_output) { - Ok(_) => {} - Err(e) => { - eprintln!("Error when saving new config: {}", e); - keyring_core::unset_default_store(); + let toml_p = dirs::config_local_dir() + .unwrap_or_else(|| { + eprintln!("Could not find home directory"); process::exit(1); - } - } + }) + .join("ion-mail") + .join("config.toml"); + + let toml_path: &str = toml_p.to_str().unwrap(); + fs::write(toml_path, toml_output).unwrap_or_else(|err| { + eprintln!("Error when saving new config: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } if let Some(refresh_token) = token_result.refresh_token() { - match refresh_token_entry.set_password(refresh_token.secret()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + refresh_token_entry + .set_password(refresh_token.secret()) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); } // save password - match entry.set_password(token_result.access_token().secret()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to set password: {}", e); + entry + .set_password(token_result.access_token().secret()) + .unwrap_or_else(|err| { + eprintln!("Failed to set password: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + token_result.access_token().clone().into_secret() } } else { @@ -652,14 +592,13 @@ pub fn send( let creds = Credentials::new(use_account.email, password); let mailer = if use_account.smtp.security == "SSL" || use_account.smtp.security == "TLS" { - let mailer = match SmtpTransport::relay(&use_account.smtp.host.clone()) { - Ok(m) => m, - Err(e) => { - eprintln!("Failed to connect via SSL/TLS: {}", e); + let mailer = + SmtpTransport::relay(&use_account.smtp.host.clone()).unwrap_or_else(|err| { + eprintln!("Failed to connect via SSL/TLS: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if use_account.oidc.is_some() { mailer .credentials(creds) @@ -673,14 +612,13 @@ pub fn send( .build() } } else if use_account.smtp.security == "STARTTLS" { - let mailer = match SmtpTransport::starttls_relay(&use_account.smtp.host.clone()) { - Ok(m) => m, - Err(e) => { - eprintln!("Failed to connect via SSL/TLS: {}", e); + let mailer = SmtpTransport::starttls_relay(&use_account.smtp.host.clone()) + .unwrap_or_else(|err| { + eprintln!("Failed to connect via SSL/TLS: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); + if use_account.oidc.is_some() { mailer .credentials(creds) @@ -743,23 +681,17 @@ fn find_html_text(part: &ParsedMail) -> Option { pub fn read(config: Config, folder: String, id: u32) { let mut imap_session = auth(config); - match imap_session.select(folder) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to select folder: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + imap_session.select(folder).unwrap_or_else(|err| { + eprintln!("Failed to select folder: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - let mails = match imap_session.fetch("1:*", "(FLAGS)") { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let mails = imap_session.fetch("1:*", "(FLAGS)").unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let mut found = false; @@ -776,33 +708,25 @@ pub fn read(config: Config, folder: String, id: u32) { let max_value = mails.len(); - let found_mail = match imap_session.fetch(format!("{}", max_value - (id as usize)), "(BODY[])") - { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let found_mail = imap_session + .fetch(format!("{}", max_value - (id as usize)), "(BODY[])") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); - match imap_session.logout() { - Ok(_) => {} - Err(e) => { - eprintln!("Logout failed, ignoring... ({})", e); - } - } + imap_session.logout().unwrap_or_else(|err| { + eprintln!("Logout failed, ignoring... ({})", err); + }); let mail_bytes = found_mail[0].body(); - let parsed = match mailparse::parse_mail(mail_bytes.unwrap()) { - Ok(p) => p, - Err(e) => { - eprintln!("Failed to parse mail: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let parsed = mailparse::parse_mail(mail_bytes.unwrap()).unwrap_or_else(|err| { + eprintln!("Failed to parse mail: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let subject = parsed .headers @@ -853,14 +777,13 @@ pub fn read(config: Config, folder: String, id: u32) { (None, None) => " (No content) ".to_string(), }; - let parsed_date = match DateTime::parse_from_rfc2822(&date) { - Ok(d) => d.with_timezone(&Local), - Err(e) => { - eprintln!("Failed to parse date: {}", e); + let parsed_date = DateTime::parse_from_rfc2822(&date) + .unwrap_or_else(|err| { + eprintln!("Failed to parse date: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }) + .with_timezone(&Local); let mut attachments: Vec = Vec::new(); @@ -902,31 +825,25 @@ pub fn read(config: Config, folder: String, id: u32) { content.push_str(&format!("\n\n{}", body)); let pager = Pager::new(); - match pager.set_prompt("Reading email (Press 'q' to exit)") { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); + pager + .set_prompt("Reading email (Press 'q' to exit)") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } - match pager.set_text(content) { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + }); - match minus::dynamic_paging(pager) { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + pager.set_text(content).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + minus::dynamic_paging(pager).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } pub fn download( @@ -938,23 +855,17 @@ pub fn download( ) { let mut imap_session = auth(config); - match imap_session.select(folder) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to select folder: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + imap_session.select(folder).unwrap_or_else(|err| { + eprintln!("Failed to select folder: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - let mails = match imap_session.fetch("1:*", "(FLAGS)") { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let mails = imap_session.fetch("1:*", "(FLAGS)").unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let mut found = false; @@ -971,26 +882,21 @@ pub fn download( let max_value = mails.len(); - let found_mail = - match imap_session.fetch(format!("{}", max_value - (id as usize)), "(BODY.PEEK[])") { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let found_mail = imap_session + .fetch(format!("{}", max_value - (id as usize)), "(BODY.PEEK[])") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let mail_bytes = found_mail[0].body(); - let parsed = match mailparse::parse_mail(mail_bytes.unwrap()) { - Ok(p) => p, - Err(e) => { - eprintln!("Failed to parse mail: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let parsed = mailparse::parse_mail(mail_bytes.unwrap()).unwrap_or_else(|err| { + eprintln!("Failed to parse mail: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let mut current_attachment_id = 0; @@ -1019,14 +925,11 @@ pub fn download( let binary_data = part.get_body_raw().unwrap(); let mut file = File::create(&save_path).unwrap(); - match file.write_all(&binary_data) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to save file: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + file.write_all(&binary_data).unwrap_or_else(|err| { + eprintln!("Failed to save file: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } } else { let mut save_path = PathBuf::from(save_folder.clone()); @@ -1035,14 +938,11 @@ pub fn download( let binary_data = part.get_body_raw().unwrap(); let mut file = File::create(&save_path).unwrap(); - match file.write_all(&binary_data) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to save file: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + file.write_all(&binary_data).unwrap_or_else(|err| { + eprintln!("Failed to save file: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } current_attachment_id += 1; } @@ -1068,42 +968,32 @@ pub fn search(config: Config, query: String, folder: String) { let mut results: Vec<(String, String)> = Vec::new(); if folder != "ALL" { - match imap_session.select(&folder) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to select folder: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + imap_session.select(&folder).unwrap_or_else(|err| { + eprintln!("Failed to select folder: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - let fetch = match imap_session.fetch("1:*", "(BODY.PEEK[])") { - Ok(f) => f, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let fetch = imap_session + .fetch("1:*", "(BODY.PEEK[])") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); for (current_id, mail) in fetch.iter().rev().enumerate() { - let parsed = match mailparse::parse_mail(mail.body().unwrap()) { - Ok(p) => p, - Err(e) => { - eprintln!("Failed to parse mail: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let parsed = mailparse::parse_mail(mail.body().unwrap()).unwrap_or_else(|err| { + eprintln!("Failed to parse mail: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let subject = parsed .headers .get_first_value("Subject") - .unwrap_or_else(|| "".to_string()); - let from = parsed - .headers - .get_first_value("From") - .unwrap_or_else(|| "".to_string()); + .unwrap_or_default(); + let from = parsed.headers.get_first_value("From").unwrap_or_default(); let body = find_plain_text(&parsed).unwrap_or_default(); if subject.contains(&query) || from.contains(&query) || body.contains(&query) { @@ -1114,52 +1004,39 @@ pub fn search(config: Config, query: String, folder: String) { } } } else { - let mailboxes = match imap_session.list(None, Some("*")) { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let mailboxes = imap_session.list(None, Some("*")).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); + + for mailbox in mailboxes.iter() { + imap_session.select(mailbox.name()).unwrap_or_else(|err| { + eprintln!("Failed to select folder: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); - for mailbox in mailboxes.iter() { - match imap_session.select(mailbox.name()) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to select folder: {}", e); + let fetch = imap_session + .fetch("1:*", "(BODY.PEEK[])") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }); - let fetch = match imap_session.fetch("1:*", "(BODY.PEEK[])") { - Ok(f) => f, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + for (current_id, mail) in fetch.iter().rev().enumerate() { + let parsed = mailparse::parse_mail(mail.body().unwrap()).unwrap_or_else(|err| { + eprintln!("Failed to parse mail: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; - - for (current_id, mail) in fetch.iter().rev().enumerate() { - let parsed = match mailparse::parse_mail(mail.body().unwrap()) { - Ok(p) => p, - Err(e) => { - eprintln!("Failed to parse mail: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + }); let subject = parsed .headers .get_first_value("Subject") - .unwrap_or_else(|| "".to_string()); - let from = parsed - .headers - .get_first_value("From") - .unwrap_or_else(|| "".to_string()); + .unwrap_or_default(); + let from = parsed.headers.get_first_value("From").unwrap_or_default(); let body = find_plain_text(&parsed).unwrap_or_default(); if subject.contains(&query) || from.contains(&query) || body.contains(&query) { @@ -1192,25 +1069,19 @@ pub fn search(config: Config, query: String, folder: String) { .unwrap(); if let Some(selection) = selection { - let s = match selection.try_into() { - Ok(s) => s, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; - read(config, results[s as usize].1.clone(), s); - } - - match imap_session.logout() { - Ok(_) => {} - Err(e) => { - eprintln!("Logout failed: {}", e); + let s = selection.try_into().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } + }); + read(config, results[s as usize].1.clone(), s); } + + imap_session.logout().unwrap_or_else(|err| { + eprintln!("Logout failed: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } // mv because move is reserved by rust @@ -1225,21 +1096,17 @@ pub fn mv(config: Config, from: String, to: String, id: Vec) { .interact() .unwrap() { - match imap_session.select(&from) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to select folder: {}", e); - } - } + imap_session.select(&from).unwrap_or_else(|err| { + eprintln!("Failed to select folder: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); - let mails = match imap_session.fetch("1:*", "(FLAGS)") { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let mails = imap_session.fetch("1:*", "(FLAGS)").unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let mut found_ids = Vec::new(); @@ -1257,18 +1124,18 @@ pub fn mv(config: Config, from: String, to: String, id: Vec) { .collect::>() .join(", ") ); + keyring_core::unset_default_store(); process::exit(1); } let max_value = mails.len(); for index in &id { - match imap_session.mv(format!("{}", max_value - (*index as usize)), &to) { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); - } - }; + imap_session + .mv(format!("{}", max_value - (*index as usize)), &to) + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + }); } println!( @@ -1286,24 +1153,18 @@ pub fn mv(config: Config, from: String, to: String, id: Vec) { pub fn delete(config: Config, id: Option>, folder: String) { let mut imap_session = auth(config); - match imap_session.select(&folder) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to select folder: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + imap_session.select(&folder).unwrap_or_else(|err| { + eprintln!("Failed to select folder: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); if let Some(id) = id { - let mails = match imap_session.fetch("1:*", "(UID)") { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - }; + let mails = imap_session.fetch("1:*", "(UID)").unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); let mut found_ids = Vec::new(); @@ -1341,45 +1202,40 @@ pub fn delete(config: Config, id: Option>, folder: String) { .collect::>() .join(","); - match imap_session.uid_store(&uid_set, "FLAGS (\\Deleted)") { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); - } - } - - match imap_session.uid_expunge(&uid_set) { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); + imap_session + .uid_store(&uid_set, "FLAGS (\\Deleted)") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }); + + imap_session.uid_expunge(&uid_set).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } } else { - let mails = match imap_session.fetch("1:*", "(UID BODY.PEEK[HEADER])") { - Ok(m) => m, - Err(e) => { - eprintln!("Unexpected Error: {}", e); + let mails = imap_session + .fetch("1:*", "(UID BODY.PEEK[HEADER])") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); let mut current_id = 0; let mut messages: Vec = Vec::new(); for mail in mails.iter().rev() { if let Some(header_bytes) = mail.header() { - let (parsed_headers, _) = match mailparse::parse_headers(header_bytes) { - Ok(parsed) => parsed, - Err(e) => { - eprintln!("Failed to parse headers: {}", e); + let (parsed_headers, _) = + mailparse::parse_headers(header_bytes).unwrap_or_else(|err| { + eprintln!("Failed to parse headers: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }); let mut subject = String::new(); let mut from = String::new(); @@ -1397,14 +1253,13 @@ pub fn delete(config: Config, id: Option>, folder: String) { } } - let parsed_date = match DateTime::parse_from_rfc2822(&date) { - Ok(d) => d.with_timezone(&Local), - Err(e) => { - eprintln!("Failed to parse date: {}", e); + let parsed_date = DateTime::parse_from_rfc2822(&date) + .unwrap_or_else(|err| { + eprintln!("Failed to parse date: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - }; + }) + .with_timezone(&Local); messages.push(format!( "[{:03}] {} | {} | {}", @@ -1464,23 +1319,19 @@ pub fn delete(config: Config, id: Option>, folder: String) { .collect::>() .join(","); - match imap_session.uid_store(&uid_set, "FLAGS (\\Deleted)") { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); + imap_session + .uid_store(&uid_set, "FLAGS (\\Deleted)") + .unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); keyring_core::unset_default_store(); process::exit(1); - } - } + }); - match imap_session.uid_expunge(&uid_set) { - Ok(_) => {} - Err(e) => { - eprintln!("Unexpected Error: {}", e); - keyring_core::unset_default_store(); - process::exit(1); - } - } + imap_session.uid_expunge(&uid_set).unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + keyring_core::unset_default_store(); + process::exit(1); + }); } } println!("Mail deleted successfully"); @@ -1489,10 +1340,7 @@ pub fn delete(config: Config, id: Option>, folder: String) { } } - match imap_session.logout() { - Ok(_) => {} - Err(e) => { - eprintln!("Logout failed, ignoring... ({})", e); - } - } + imap_session.logout().unwrap_or_else(|err| { + eprintln!("Logout failed, ignoring... ({})", err); + }); } diff --git a/src/main.rs b/src/main.rs index e4767fb..5e6be86 100644 --- a/src/main.rs +++ b/src/main.rs @@ -58,70 +58,54 @@ pub struct Endpoints { } fn main() { - let toml_p = dirs::home_dir().ok_or_else(|| { - eprintln!("Could not find home directory"); - process::exit(1); - }); - - let mut toml_path_unwrap = toml_p.unwrap(); - - toml_path_unwrap.push(".ion-mail"); - - if !toml_path_unwrap.exists() { - match fs::create_dir_all(&toml_path_unwrap) { - Ok(_) => {} - Err(e) => { - eprintln!("Failed to create directories: {}", e); - } - } + let mut toml_p = dirs::config_local_dir() + .unwrap_or_else(|| { + eprintln!("Could not find config directory"); + process::exit(1); + }) + .join("ion-mail"); + + if !toml_p.exists() { + fs::create_dir_all(&toml_p).unwrap_or_else(|err| { + eprintln!("Failed to create directories: {}", err); + process::exit(1); + }); } - toml_path_unwrap.push("config.toml"); + toml_p.push("config.toml"); - let toml_path: &str = toml_path_unwrap.to_str().unwrap(); + let toml_path: &str = toml_p.to_str().unwrap(); let mut config = Config { accounts: Vec::new(), }; - if toml_path_unwrap.exists() { - let config_str = match fs::read_to_string(toml_path) { - Ok(c) => c, - Err(e) => { - eprintln!("Error when reading config: {}", e); - process::exit(1); - } - }; + if toml_p.exists() { + let config_str = fs::read_to_string(toml_path).unwrap_or_else(|err| { + eprintln!("Error when reading config: {}", err); + process::exit(1); + }); - config = match toml::from_str(&config_str) { - Ok(c) => c, - Err(e) => { - eprintln!("Error when parsing toml: {}", e); - process::exit(1); - } - }; + config = toml::from_str(&config_str).unwrap_or_else(|err| { + eprintln!("Error when parsing toml: {}", err); + process::exit(1); + }); } #[cfg(target_os = "windows")] { - let windows_store = match windows_native_keyring_store::Store::new() { - Ok(s) => s, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - process::exit(1); - } - }; + let windows_store = windows_native_keyring_store::Store::new().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + process::exit(1); + }); keyring_core::set_default_store(windows_store); } #[cfg(target_os = "linux")] { - let zbus_store = match zbus_secret_service_keyring_store::Store::new() { - Ok(s) => s, - Err(e) => { - eprintln!("Unexpected Error: {}", e); - process::exit(1); - } - }; + let zbus_store = zbus_secret_service_keyring_store::Store::new().unwrap_or_else(|err| { + eprintln!("Unexpected Error: {}", err); + process::exit(1); + }); keyring_core::set_default_store(zbus_store); } From f9d6dcca3da1780052b423df9cc5bbdd718d889c Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+Paulprojects8711@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:33:07 +0200 Subject: [PATCH 4/9] chore: update to v0.2.1 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index ad58b70..db01aae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ion-mail" -version = "0.2.0" +version = "0.2.1" edition = "2024" description = "A simple mail CLI" authors = ["Paul8711gamezz "] From bc7ac94b7a7c9014232c4a455129d3ab4f5bf409 Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+Paulprojects8711@users.noreply.github.com> Date: Sun, 14 Jun 2026 11:14:43 +0200 Subject: [PATCH 5/9] chore: update author --- Cargo.toml | 4 ++-- LICENSE | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index db01aae..d40737f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,9 +3,9 @@ name = "ion-mail" version = "0.2.1" edition = "2024" description = "A simple mail CLI" -authors = ["Paul8711gamezz "] +authors = ["Paul8711 "] license = "AGPL-3.0-only" -repository = "https://github.com/Paulprojects8711/ion-mail" +repository = "https://github.com/paul8711-code/ion-mail" [package.metadata.wix] upgrade-guid = "E939105E-8B38-4C78-80D6-65E9FB114071" diff --git a/LICENSE b/LICENSE index 88e4431..2f3eccd 100644 --- a/LICENSE +++ b/LICENSE @@ -630,7 +630,7 @@ state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ion-mail Heavyweight CLI email client (in Rust) - Copyright (C) 2026 Paul8711gamezz (Paul8711) + Copyright (C) 2026 Paul8711 This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published From 8ef06bc731257585013eab3254d7cf2353407c86 Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+Paulprojects8711@users.noreply.github.com> Date: Sun, 14 Jun 2026 11:15:10 +0200 Subject: [PATCH 6/9] chore: update dependencies --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index ff032cc..cdd72c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1459,7 +1459,7 @@ dependencies = [ [[package]] name = "ion-mail" -version = "0.2.0" +version = "0.2.1" dependencies = [ "chrono", "clap", From c81e919304eb9cb7af305e2ee8702f3e04940c7f Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+Paulprojects8711@users.noreply.github.com> Date: Sun, 14 Jun 2026 11:17:49 +0200 Subject: [PATCH 7/9] chore: update version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d40737f..2bb1102 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ion-mail" -version = "0.2.1" +version = "0.2.2" edition = "2024" description = "A simple mail CLI" authors = ["Paul8711 "] From 9c16a77493b81b95720b03a6af64683eebf91f4e Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+Paulprojects8711@users.noreply.github.com> Date: Sun, 14 Jun 2026 11:20:32 +0200 Subject: [PATCH 8/9] chore: update cargo-dist --- Cargo.lock | 2 +- wix/main.wxs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cdd72c8..a29875e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1459,7 +1459,7 @@ dependencies = [ [[package]] name = "ion-mail" -version = "0.2.1" +version = "0.2.2" dependencies = [ "chrono", "clap", diff --git a/wix/main.wxs b/wix/main.wxs index 3ba6f12..3c15e75 100644 --- a/wix/main.wxs +++ b/wix/main.wxs @@ -62,7 +62,7 @@ Id='*' Name='ion-mail' UpgradeCode='E939105E-8B38-4C78-80D6-65E9FB114071' - Manufacturer='Paul8711gamezz' + Manufacturer='Paul8711' Language='1033' Codepage='1252' Version='$(var.Version)'> @@ -70,7 +70,7 @@ --> - + From ad5580f97123de1ea58e661da70cf3fe6141e6d3 Mon Sep 17 00:00:00 2001 From: Paul8711 <154304377+Paulprojects8711@users.noreply.github.com> Date: Sun, 14 Jun 2026 16:50:42 +0200 Subject: [PATCH 9/9] chore: update description --- Cargo.toml | 4 ++-- LICENSE | 2 +- README.md | 2 +- src/args.rs | 6 +++++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2bb1102..10c86ba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "ion-mail" -version = "0.2.2" +version = "0.2.3" edition = "2024" -description = "A simple mail CLI" +description = "Mail CLI in Rust supporting all mail functions & OAuth2 login" authors = ["Paul8711 "] license = "AGPL-3.0-only" repository = "https://github.com/paul8711-code/ion-mail" diff --git a/LICENSE b/LICENSE index 2f3eccd..ee591af 100644 --- a/LICENSE +++ b/LICENSE @@ -629,7 +629,7 @@ to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - ion-mail Heavyweight CLI email client (in Rust) + ion-mail Mail CLI in Rust supporting all mail functions & OAuth2 login Copyright (C) 2026 Paul8711 This program is free software: you can redistribute it and/or modify diff --git a/README.md b/README.md index 0df62be..f2742c9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ion-mail -Heavyweight CLI email client (in Rust) +Mail CLI in Rust supporting all mail functions & OAuth2 login Please report any bugs you find, some cannot be fixed because they are server related. diff --git a/src/args.rs b/src/args.rs index 746accc..a1f5f21 100644 --- a/src/args.rs +++ b/src/args.rs @@ -1,7 +1,11 @@ use clap::{Parser, Subcommand}; #[derive(Parser)] -#[command(author, version, about = "A simple mail CLI")] +#[command( + author, + version, + about = "Mail CLI in Rust supporting all mail functions & OAuth2 login" +)] pub struct Cli { #[command(subcommand)] pub resource: Resource,