diff --git a/.github/workflows/nix-build.yaml b/.github/workflows/nix-build.yaml index 2802cebb..6eb21dd3 100644 --- a/.github/workflows/nix-build.yaml +++ b/.github/workflows/nix-build.yaml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v2.3.4 - uses: cachix/install-nix-action@v13 with: - install_url: https://nixos-nix-install-tests.cachix.org/serve/lb41az54kzk6j12p81br4bczary7m145/install + install_url: https://nixos-nix-install-tests.cachix.org/serve/i6laym9jw3wg9mw6ncyrk6gjx4l34vvx/install install_options: '--tarball-url-prefix https://nixos-nix-install-tests.cachix.org/serve' extra_nix_config: | experimental-features = nix-command flakes diff --git a/CHANGELOG.md b/CHANGELOG.md index d79f4445..f20ba47a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Config option `signature-delimiter` to customize the signature delimiter (default to `-- \n`) [[#114](https://github.com/soywod/himalaya/pull/114)] +- Expand tilde and env vars for `downloads-dir` and `signature` [#102] + +### Changed + +- Pagination for list and search cmd starts from 1 instead of 0 [#186] + +### Fixed + +- New/reply/forward from Vim plugin since Tpl refactor [#176] + ## [0.4.0] - 2021-06-03 ### Added @@ -277,6 +290,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#95]: https://github.com/soywod/himalaya/issues/95 [#96]: https://github.com/soywod/himalaya/issues/96 [#100]: https://github.com/soywod/himalaya/issues/100 +[#102]: https://github.com/soywod/himalaya/issues/102 [#109]: https://github.com/soywod/himalaya/issues/109 [#117]: https://github.com/soywod/himalaya/issues/117 [#121]: https://github.com/soywod/himalaya/issues/121 @@ -296,3 +310,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#144]: https://github.com/soywod/himalaya/issues/144 [#146]: https://github.com/soywod/himalaya/issues/146 [#160]: https://github.com/soywod/himalaya/issues/160 +[#176]: https://github.com/soywod/himalaya/issues/176 +[#186]: https://github.com/soywod/himalaya/issues/186 diff --git a/Cargo.lock b/Cargo.lock index 9a2ca9a0..8e7169e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.14.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" dependencies = [ "gimli", ] @@ -19,11 +19,11 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" dependencies = [ - "memchr 2.4.0", + "memchr 2.3.4", ] [[package]] @@ -66,11 +66,12 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.56" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" +checksum = "4717cfcbfaa661a0fd48f8453951837ae7e8f81e481fbb136e3202d72805a744" dependencies = [ "addr2line", + "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", @@ -105,9 +106,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitvec" @@ -129,15 +130,15 @@ checksum = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" [[package]] name = "byteorder" -version = "1.3.4" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.67" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" [[package]] name = "cfg-if" @@ -219,6 +220,27 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "email" version = "0.0.20" @@ -300,18 +322,18 @@ checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" [[package]] name = "encoding_rs" -version = "0.8.26" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801bbab217d7f79c0062f4f7205b5d4427c6d1a7bd7aafdd1475f7c59d62b283" +checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "env_logger" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17392a012ea30ef05a610aa97dfb49496e71c9f676b27879922ea5bdf60d9d3f" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" dependencies = [ "atty", "humantime", @@ -341,9 +363,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" dependencies = [ "instant", ] @@ -375,6 +397,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -389,33 +421,33 @@ checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" [[package]] name = "futures-core" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" +checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" [[package]] name = "futures-io" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" +checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582" [[package]] name = "futures-task" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" +checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2" [[package]] name = "futures-util" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" +checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" dependencies = [ "autocfg 1.0.1", "futures-core", "futures-io", "futures-task", - "memchr 2.4.0", + "memchr 2.3.4", "pin-project-lite", "pin-utils", "slab", @@ -423,9 +455,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", "libc", @@ -434,21 +466,21 @@ dependencies = [ [[package]] name = "gimli" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "hermit-abi" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] @@ -473,10 +505,12 @@ dependencies = [ "rfc2047-decoder", "serde", "serde_json", + "shellexpand", "terminal_size", "toml", "tree_magic", "unicode-width", + "url", "uuid 0.8.2", ] @@ -493,9 +527,9 @@ dependencies = [ [[package]] name = "httpdate" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05842d0d43232b23ccb7060ecb0f0626922c21f30012e97b767b30afd4a5d4b9" +checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" [[package]] name = "humantime" @@ -516,9 +550,9 @@ dependencies = [ [[package]] name = "imap" -version = "3.0.0-alpha.3" +version = "3.0.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6db7782d7160066e0293d32c31b06b443f6da58a86594629554582d8a006097" +checksum = "b26b6f9b2c28b6aa7fabf623e75a8b6bd382ee0951d0e052c1d32c887150fb67" dependencies = [ "base64 0.13.0", "bufstream", @@ -526,7 +560,7 @@ dependencies = [ "imap-proto", "lazy_static", "native-tls", - "nom 6.1.2", + "nom 6.2.1", "regex", ] @@ -536,14 +570,14 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ad9b46a79efb6078e578ae04e51463d7c3e8767864687f7e63095b3cbefafbb" dependencies = [ - "nom 6.1.2", + "nom 6.2.1", ] [[package]] name = "indexmap" -version = "1.6.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" dependencies = [ "autocfg 1.0.1", "hashbrown", @@ -551,9 +585,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" dependencies = [ "cfg-if 1.0.0", ] @@ -583,7 +617,7 @@ dependencies = [ [[package]] name = "lettre" version = "0.10.0-rc.3" -source = "git+https://github.com/TornaxO7/lettre/?branch=ContentTransferEncoding#af69dfadc9f5a19be8599811195ce0a536ef474c" +source = "git+https://github.com/TornaxO7/lettre/?branch=ContentTransferEncoding#912ec605c5a24bbec1b1a5126c7768d80677f29a" dependencies = [ "base64 0.13.0", "fastrand", @@ -593,7 +627,7 @@ dependencies = [ "idna", "mime", "native-tls", - "nom 6.1.2", + "nom 6.2.1", "once_cell", "quoted_printable", "r2d2", @@ -617,9 +651,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.94" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" +checksum = "a7f823d141fe0a24df1e23b4af4e3c7ba9e5966ec514ea068c93024aa7deb765" [[package]] name = "lock_api" @@ -650,9 +684,9 @@ dependencies = [ [[package]] name = "mailparse" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62db73ff1a42b0e3a8858cf0d5c183bdfc23491f7294ae4a8200c83577457386" +checksum = "c06f526fc13a50f46a3689a6f438cb833c59817c898bb40a3954f341ddf74ce1" dependencies = [ "base64 0.13.0", "charset", @@ -667,9 +701,9 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" @@ -682,9 +716,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.4.0" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" [[package]] name = "mime" @@ -704,9 +738,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" dependencies = [ "lazy_static", "libc", @@ -731,13 +765,13 @@ dependencies = [ [[package]] name = "nom" -version = "6.1.2" +version = "6.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" +checksum = "9c5c51b9083a3c620fa67a2a635d1ce7d95b897e957d6b28ff9a5da960a103a6" dependencies = [ "bitvec", "funty", - "memchr 2.4.0", + "memchr 2.3.4", "version_check 0.9.3", ] @@ -762,21 +796,21 @@ dependencies = [ [[package]] name = "object" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" [[package]] name = "once_cell" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" [[package]] name = "openssl" -version = "0.10.34" +version = "0.10.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7830286ad6a3973c0f1d9b73738f69c76b739301d0229c4b96501695cbe4c8" +checksum = "8d9facdb76fec0b73c406f125d44d86fdad818d66fef0531eec9233ca425ff4a" dependencies = [ "bitflags", "cfg-if 1.0.0", @@ -794,9 +828,9 @@ checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.63" +version = "0.9.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b0d6fb7d80f877617dfcb014e605e2b5ab2fb0afdf27935219bb6bd984cb98" +checksum = "1996d2d305e561b70d1ee0c53f1542833f4e1ac6ce9a6708b6ff2738ca67dc82" dependencies = [ "autocfg 1.0.1", "cc", @@ -849,11 +883,17 @@ dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall 0.2.8", + "redox_syscall 0.2.10", "smallvec", "winapi", ] +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + [[package]] name = "petgraph" version = "0.5.1" @@ -890,18 +930,18 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "proc-macro2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" +checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] @@ -963,14 +1003,14 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ "libc", - "rand_chacha 0.3.0", - "rand_core 0.6.2", - "rand_hc 0.3.0", + "rand_chacha 0.3.1", + "rand_core 0.6.3", + "rand_hc 0.3.1", ] [[package]] @@ -985,12 +1025,12 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.2", + "rand_core 0.6.3", ] [[package]] @@ -1010,9 +1050,9 @@ checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" [[package]] name = "rand_core" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ "getrandom", ] @@ -1028,11 +1068,11 @@ dependencies = [ [[package]] name = "rand_hc" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" dependencies = [ - "rand_core 0.6.2", + "rand_core 0.6.3", ] [[package]] @@ -1105,21 +1145,31 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] name = "redox_syscall" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom", + "redox_syscall 0.2.10", +] + [[package]] name = "regex" -version = "1.5.4" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "2a26af418b574bd56588335b3a3659a65725d4e636eb1016c2f9e3b38c7cc759" dependencies = [ "aho-corasick", - "memchr 2.4.0", + "memchr 2.3.4", "regex-syntax", ] @@ -1151,9 +1201,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" [[package]] name = "ryu" @@ -1194,9 +1244,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "security-framework" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3670b1d2fdf6084d192bc71ead7aabe6c06aa2ea3fbd9cc3ac111fa5c2b1bd84" +checksum = "23a2ac85147a3a11d77ecf1bc7166ec0b92febfa4461c37944e180f319ece467" dependencies = [ "bitflags", "core-foundation", @@ -1207,9 +1257,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3676258fd3cfe2c9a0ec99ce3038798d847ce3e4bb17746373eb9f0f1ac16339" +checksum = "7e4effb91b4b8b6fb7732e670b6cee160278ff8e6bf485c7805d9e319d76e284" dependencies = [ "core-foundation-sys", "libc", @@ -1217,18 +1267,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.118" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" +checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.118" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" +checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc" dependencies = [ "proc-macro2", "quote", @@ -1237,20 +1287,29 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.61" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "shellexpand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdb7831b2d85ddf4a7b148aa19d0587eddbe8671a436b7bd1182eaad0f2829" +dependencies = [ + "dirs-next", +] + [[package]] name = "slab" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "smallvec" @@ -1266,9 +1325,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" [[package]] name = "syn" -version = "1.0.73" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7" +checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" dependencies = [ "proc-macro2", "quote", @@ -1289,8 +1348,8 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ "cfg-if 1.0.0", "libc", - "rand 0.8.3", - "redox_syscall 0.2.8", + "rand 0.8.4", + "redox_syscall 0.2.10", "remove_dir_all", "winapi", ] @@ -1306,9 +1365,9 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd2d183bd3fac5f5fe38ddbeb4dc9aec4a39a9d7d59e7491d900302da01cbe1" +checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" dependencies = [ "libc", "winapi", @@ -1336,9 +1395,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" +checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" dependencies = [ "tinyvec_macros", ] @@ -1373,18 +1432,15 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] +checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" [[package]] name = "unicode-normalization" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] @@ -1397,9 +1453,21 @@ checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] [[package]] name = "uuid" @@ -1421,9 +1489,9 @@ dependencies = [ [[package]] name = "vcpkg" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdbff6266a24120518560b5dc983096efb98462e51d0d68169895b237be3e5d" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" diff --git a/Cargo.toml b/Cargo.toml index 9a59c62b..2d0d0f74 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,36 +6,28 @@ authors = ["soywod "] edition = "2018" [dependencies] -# Debugging and error handling +atty = "0.2.14" +chrono = "0.4.19" +clap = { version = "2.33.3", default-features = false, features = ["suggestions", "color"] } +colorful = "0.2.1" env_logger = "0.8.3" error-chain = "0.12.4" -log = "0.4.14" - -# Sending, reading and creating messages/mails -imap = "3.0.0-alpha.3" +imap = "3.0.0-alpha.4" imap-proto = "0.14.3" -mailparse = "0.13.4" +# This commit includes the de/serialization of the ContentType # lettre = { version = "0.10.0-rc.1", features = ["serde"] } -# Hint: This commit includes the se- and deserialization of the ContentType lettre = { git = "https://github.com/TornaxO7/lettre/", branch = "ContentTransferEncoding", features = ["serde"] } lettre_email = "0.9.4" +log = "0.4.14" +mailparse = "0.13.4" native-tls = "0.2" rfc2047-decoder = "0.1.2" -tree_magic = "0.2.3" - -# Serialization -serde = {version = "1.0.118", features = ["derive"]} +serde = { version = "1.0.118", features = ["derive"] } serde_json = "1.0.61" - -# UI +shellexpand = "2.1.0" terminal_size = "0.1.15" -colorful = "0.2.1" -clap = {version = "2.33.3", default-features = false, features = ["suggestions", "color"]} - -# Rest toml = "0.5.8" +tree_magic = "0.2.3" unicode-width = "0.1.7" -uuid = {version = "0.8", features = ["v4"]} -atty = "0.2.14" -chrono = "0.4.19" - +url = "2.2.2" +uuid = { version = "0.8", features = ["v4"] } diff --git a/flake.lock b/flake.lock index 386d9a9e..cb69e094 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1606424373, - "narHash": "sha256-oq8d4//CJOrVj+EcOaSXvMebvuTkmBJuT5tzlfewUnQ=", + "lastModified": 1627913399, + "narHash": "sha256-hY8g6H2KFL8ownSiFeMOjwPC8P0ueXpCVEbxgda3pko=", "owner": "edolstra", "repo": "flake-compat", - "rev": "99f1c2157fba4bfe6211a321fd0ee43199025dbf", + "rev": "12c64ca55c1014cdc1b16ed5a804aa8576601ff2", "type": "github" }, "original": { @@ -50,11 +50,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1621840840, - "narHash": "sha256-o6h6+d5ZwrFmOTe+ma9s1Z9kyHsCW1C84IA8RZ9/fIU=", + "lastModified": 1627857416, + "narHash": "sha256-AV0MsFVzbWI2MZbJ2j0kc8ooFLGSCZHuM9ipaWR9ds4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "ea7d4aa9b8225abd6147339f0d56675d6f1f0fd1", + "rev": "aaf9676fbb7fb4570216ca1e189a3dc769d62c45", "type": "github" }, "original": { @@ -94,11 +94,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1621996674, - "narHash": "sha256-TbqYv4mnCXCpwGsMgpC94lbxtSKet8IkQxlUYXkfA/4=", + "lastModified": 1627957145, + "narHash": "sha256-cY5lS2S/RMsC1xFtkcmhLXlVP7ahZoxFeKedkXDvIzY=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "b5651a474dd332c6b8f772561eadd0b85ac224a0", + "rev": "ab6f3086de97980e4fdcb0560921852a407e0b79", "type": "github" }, "original": { @@ -109,11 +109,11 @@ }, "utils": { "locked": { - "lastModified": 1620759905, - "narHash": "sha256-WiyWawrgmyN0EdmiHyG2V+fqReiVi8bM9cRdMaKQOFg=", + "lastModified": 1623875721, + "narHash": "sha256-A8BU7bjS5GirpAUv4QA+QnJ4CceLHkcXdRp4xITDB0s=", "owner": "numtide", "repo": "flake-utils", - "rev": "b543720b25df6ffdfcf9227afafc5b8c1fabfae8", + "rev": "f7e004a55b120c02ecb6219596820fcd32ca8772", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index c24723d3..80b63e09 100644 --- a/flake.nix +++ b/flake.nix @@ -70,8 +70,9 @@ inherit (packages.${name}) version; name = "${name}-vim"; src = self; - configurePhase = "cd vim/"; buildInputs = [ packages.${name} ]; + dontConfigure = false; + configurePhase = "cd vim/"; postInstall = '' mkdir -p $out/bin ln -s ${packages.${name}}/bin/himalaya $out/bin/himalaya diff --git a/src/config/model.rs b/src/config/model.rs index 856ba717..7ac35fb6 100644 --- a/src/config/model.rs +++ b/src/config/model.rs @@ -2,6 +2,7 @@ use error_chain::error_chain; use lettre::transport::smtp::authentication::Credentials as SmtpCredentials; use log::debug; use serde::Deserialize; +use shellexpand; use std::{ collections::HashMap, env, @@ -26,6 +27,7 @@ pub struct Account { // Override pub name: Option, pub downloads_dir: Option, + pub signature_delimiter: Option, pub signature: Option, pub default_page_size: Option, pub watch_cmds: Option>, @@ -166,6 +168,7 @@ impl Account { name: name.and_then(|name| Some(name.to_string())), downloads_dir: Some(PathBuf::from(r"/tmp")), signature: None, + signature_delimiter: None, default_page_size: Some(42), default: Some(true), email: email_addr.into(), @@ -226,7 +229,11 @@ impl Account { /// assert_eq!(account_with_default_signature, account_cmp2); /// } /// ``` - pub fn new_with_signature(name: Option<&str>, email_addr: &str, signature: Option<&str>) -> Self { + pub fn new_with_signature( + name: Option<&str>, + email_addr: &str, + signature: Option<&str>, + ) -> Self { let mut account = Account::new(name, email_addr); // Use the default signature "Account Signature", if the programmer didn't provide a custom @@ -245,6 +252,7 @@ impl Default for Account { Self { name: None, downloads_dir: None, + signature_delimiter: None, signature: None, default_page_size: None, default: None, @@ -274,6 +282,8 @@ pub struct Config { pub name: String, pub downloads_dir: Option, pub notify_cmd: Option, + /// Option to override the default signature delimiter `--\n `. + pub signature_delimiter: Option, pub signature: Option, pub default_page_size: Option, pub watch_cmds: Option>, @@ -358,8 +368,17 @@ impl Config { account .downloads_dir .as_ref() - .unwrap_or(self.downloads_dir.as_ref().unwrap_or(&env::temp_dir())) - .to_owned() + .and_then(|dir| dir.to_str()) + .and_then(|dir| shellexpand::full(dir).ok()) + .map(|dir| PathBuf::from(dir.to_string())) + .unwrap_or( + self.downloads_dir + .as_ref() + .and_then(|dir| dir.to_str()) + .and_then(|dir| shellexpand::full(dir).ok()) + .map(|dir| PathBuf::from(dir.to_string())) + .unwrap_or(env::temp_dir()), + ) .join(filename) } @@ -382,13 +401,21 @@ impl Config { } pub fn signature(&self, account: &Account) -> Option { + let default_sig_delim = String::from("-- \n"); + let sig_delim = account + .signature_delimiter + .as_ref() + .or_else(|| self.signature_delimiter.as_ref()) + .unwrap_or(&default_sig_delim); let sig = account .signature .as_ref() .or_else(|| self.signature.as_ref()); - - sig.and_then(|sig| fs::read_to_string(sig).ok()) + sig.and_then(|sig| shellexpand::full(sig).ok()) + .map(|sig| sig.to_string()) + .and_then(|sig| fs::read_to_string(sig).ok()) .or_else(|| sig.map(|sig| sig.to_owned())) + .map(|sig| sig_delim.to_owned() + sig.as_ref()) } pub fn default_page_size(&self, account: &Account) -> usize { @@ -428,6 +455,7 @@ impl Default for Config { name: String::new(), downloads_dir: None, notify_cmd: None, + signature_delimiter: None, signature: None, default_page_size: None, watch_cmds: None, diff --git a/src/imap/model.rs b/src/imap/model.rs index 155b650b..8dcb501b 100644 --- a/src/imap/model.rs +++ b/src/imap/model.rs @@ -25,20 +25,21 @@ impl<'a> ImapConnector<'a> { pub fn new(account: &'a Account) -> Result { debug!("create TLS builder"); let insecure = account.imap_insecure(); - let tls = TlsConnector::builder() + let ssl_conn = TlsConnector::builder() .danger_accept_invalid_certs(insecure) .danger_accept_invalid_hostnames(insecure) .build() .chain_err(|| "Could not create TLS connector")?; debug!("create client"); - let client = if account.imap_starttls() { - imap::connect_starttls(account.imap_addr(), &account.imap_host, &tls) - .chain_err(|| "Could not connect using STARTTLS") - } else { - imap::connect(account.imap_addr(), &account.imap_host, &tls) - .chain_err(|| "Could not connect using TLS") - }?; + let mut client_builder = imap::ClientBuilder::new(&account.imap_host, account.imap_port); + if account.imap_starttls() { + debug!("enable STARTTLS"); + client_builder.starttls(); + } + let client = client_builder + .connect(|domain, tcp| Ok(TlsConnector::connect(&ssl_conn, domain, tcp)?)) + .chain_err(|| "Could not connect to IMAP server")?; debug!("create session"); let sess = client diff --git a/src/main.rs b/src/main.rs index bc073e98..89de1c10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,14 @@ -use clap; +use clap::{self, ArgMatches}; use env_logger; use error_chain::error_chain; use log::{debug, error, trace}; use std::{env, path::PathBuf, process::exit}; +use url::{self, Url}; use himalaya::{ config::{cli::config_args, model::Config}, ctx::Ctx, - flag, imap, mbox, msg, comp, + flag, imap, mbox, msg::{self, cli::msg_matches_mailto}, comp, output::{cli::output_args, model::Output}, }; @@ -20,6 +21,9 @@ error_chain! { MboxCli(himalaya::mbox::cli::Error, himalaya::mbox::cli::ErrorKind); MsgCli(himalaya::msg::cli::Error, himalaya::msg::cli::ErrorKind); } + foreign_links { + Url(url::ParseError); + } } fn parse_args<'a>() -> clap::App<'a, 'a> { @@ -43,6 +47,18 @@ fn run() -> Result<()> { env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "off"), ); + let raw_args: Vec = env::args().collect(); + if raw_args.len() > 1 && raw_args[1].starts_with("mailto:") { + let config = Config::new(None)?; + let account = config.find_account_by_name(None)?; + let output = Output::new("plain"); + let mbox = "INBOX"; + let arg_matches = ArgMatches::default(); + let app = Ctx::new(&config, &account, &output, &mbox, &arg_matches); + let url = Url::parse(&raw_args[1])?; + return Ok(msg_matches_mailto(&app, &url)?); + } + let args = parse_args(); let arg_matches = args.get_matches(); diff --git a/src/msg/cli.rs b/src/msg/cli.rs index 1e228947..f76f5ff1 100644 --- a/src/msg/cli.rs +++ b/src/msg/cli.rs @@ -1,28 +1,25 @@ +use super::body::Body; use super::envelope::Envelope; use super::model::{Msg, Msgs}; -use super::body::Body; +use url::Url; use atty::Stream; use clap; use error_chain::error_chain; +use lettre::message::header::ContentTransferEncoding; use log::{debug, error, trace}; use std::{ + borrow::Cow, collections::HashMap, + convert::TryFrom, fs, io::{self, BufRead}, - convert::TryFrom, }; use imap::types::Flag; -use crate::{ - ctx::Ctx, - imap::model::ImapConnector, - input, - mbox::cli::mbox_target_arg, - smtp, -}; +use crate::{ctx::Ctx, imap::model::ImapConnector, input, mbox::cli::mbox_target_arg, smtp}; error_chain! { links { @@ -36,7 +33,6 @@ error_chain! { } } -// == Main-Functions == pub fn subcmds<'a>() -> Vec> { vec![ clap::SubCommand::with_name("list") @@ -260,6 +256,7 @@ fn msg_matches_list(ctx: &Ctx, opt_matches: Option<&clap::ArgMatches>) -> Result debug!("page size: {:?}", page_size); let page: usize = opt_matches .and_then(|matches| matches.value_of("page").unwrap().parse().ok()) + .map(|page| 1.max(page) - 1) .unwrap_or_default(); debug!("page: {}", &page); @@ -291,7 +288,8 @@ fn msg_matches_search(ctx: &Ctx, matches: &clap::ArgMatches) -> Result { .value_of("page") .unwrap() .parse() - .unwrap_or_default(); + .map(|page| 1.max(page) - 1) + .unwrap_or(1); debug!("page: {}", &page); let query = matches @@ -469,6 +467,53 @@ fn msg_matches_reply(ctx: &Ctx, matches: &clap::ArgMatches) -> Result { Ok(true) } +pub fn msg_matches_mailto(ctx: &Ctx, url: &Url) -> Result<()> { + debug!("mailto command matched"); + + let mut imap_conn = ImapConnector::new(&ctx.account)?; + + let mut cc = Vec::new(); + let mut bcc = Vec::new(); + let mut subject = Cow::default(); + let mut body = Cow::default(); + + for (key, val) in url.query_pairs() { + match key.as_bytes() { + b"cc" => { + cc.push(val.into()); + } + b"bcc" => { + bcc.push(val.into()); + } + b"subject" => { + subject = val; + } + b"body" => { + body = val; + } + _ => (), + } + } + + let envelope = Envelope { + from: vec![ctx.config.address(ctx.account)], + to: vec![url.path().to_string()], + encoding: ContentTransferEncoding::Base64, + bcc: Some(bcc), + cc: Some(cc), + signature: ctx.config.signature(&ctx.account), + subject: Some(subject.into()), + ..Envelope::default() + }; + + let mut msg = Msg::new_with_envelope(&ctx.account, envelope); + msg.body = Body::from(body.as_ref()); + msg_interaction(&ctx, &mut msg, &mut imap_conn)?; + + imap_conn.logout(); + Ok(()) +} + fn msg_matches_forward(ctx: &Ctx, matches: &clap::ArgMatches) -> Result { debug!("forward command matched"); @@ -581,7 +626,7 @@ fn msg_matches_send(ctx: &Ctx, matches: &clap::ArgMatches) -> Result { let mut imap_conn = ImapConnector::new(&ctx.account)?; - let msg: String = if atty::is(Stream::Stdin) { + let msg = if atty::is(Stream::Stdin) || ctx.output.is_json() { matches .value_of("message") .unwrap_or_default() @@ -786,7 +831,6 @@ fn tpl_matches_forward(ctx: &Ctx, matches: &clap::ArgMatches) -> Result { /// This function opens the prompt to do some actions to the msg like sending, editing it again and /// so on. fn msg_interaction(ctx: &Ctx, msg: &mut Msg, imap_conn: &mut ImapConnector) -> Result { - // let the user change the body a little bit first, before opening the prompt msg.edit_body()?; @@ -807,7 +851,7 @@ fn msg_interaction(ctx: &Ctx, msg: &mut Msg, imap_conn: &mut ImapConnector) -> R println!("{}", err); println!("Please reedit your msg to make it to a sendable message!"); continue; - }, + } }; smtp::send(&ctx.account, &sendable)?; diff --git a/src/output/model.rs b/src/output/model.rs index da6a08a1..13b9f6c7 100644 --- a/src/output/model.rs +++ b/src/output/model.rs @@ -3,7 +3,7 @@ use std::fmt; // Output format -#[derive(Debug)] +#[derive(Debug, Eq, PartialEq)] pub enum OutputFmt { Plain, Json, @@ -64,6 +64,14 @@ impl Output { } } } + + pub fn is_plain(&self) -> bool { + self.fmt == OutputFmt::Plain + } + + pub fn is_json(&self) -> bool { + self.fmt == OutputFmt::Json + } } impl Default for Output { diff --git a/tests/imap_test.rs b/tests/imap_test.rs index c5b345a3..2fab32cd 100644 --- a/tests/imap_test.rs +++ b/tests/imap_test.rs @@ -7,6 +7,31 @@ use himalaya::{ use lettre::message::SinglePart; use lettre::Message; +fn get_account(addr: &str) -> Account { + Account { + name: None, + downloads_dir: None, + signature_delimiter: None, + signature: None, + default_page_size: None, + default: Some(true), + email: addr.into(), + watch_cmds: None, + imap_host: String::from("localhost"), + imap_port: 3993, + imap_starttls: Some(false), + imap_insecure: Some(true), + imap_login: addr.into(), + imap_passwd_cmd: String::from("echo 'password'"), + smtp_host: String::from("localhost"), + smtp_port: 3465, + smtp_starttls: Some(false), + smtp_insecure: Some(true), + smtp_login: addr.into(), + smtp_passwd_cmd: String::from("echo 'password'"), + } +} + #[test] fn mbox() { let account = Account::new(Some("AccountName"), "inbox@localhost"); diff --git a/vim/autoload/himalaya/msg.vim b/vim/autoload/himalaya/msg.vim index 2f55a110..f7804968 100644 --- a/vim/autoload/himalaya/msg.vim +++ b/vim/autoload/himalaya/msg.vim @@ -86,7 +86,7 @@ function! himalaya#msg#write() let account = himalaya#account#curr() let msg = s:cli("--account %s template new", [shellescape(account)], "Fetching new template", 0) silent! edit Himalaya write - call append(0, split(substitute(msg.template, "\r", "", "g"), "\n")) + call append(0, split(substitute(msg.raw, "\r", "", "g"), "\n")) silent execute "$d" setlocal filetype=himalaya-msg-write let &modified = 0 @@ -112,7 +112,7 @@ function! himalaya#msg#reply() \0, \) execute printf("silent! edit Himalaya reply [%d]", msg_id) - call append(0, split(substitute(msg.template, "\r", "", "g"), "\n")) + call append(0, split(substitute(msg.raw, "\r", "", "g"), "\n")) silent execute "$d" setlocal filetype=himalaya-msg-write let &modified = 0 @@ -138,7 +138,7 @@ function! himalaya#msg#reply_all() \0 \) execute printf("silent! edit Himalaya reply all [%d]", msg_id) - call append(0, split(substitute(msg.template, "\r", "", "g"), "\n")) + call append(0, split(substitute(msg.raw, "\r", "", "g"), "\n")) silent execute "$d" setlocal filetype=himalaya-msg-write let &modified = 0 @@ -164,7 +164,7 @@ function! himalaya#msg#forward() \0 \) execute printf("silent! edit Himalaya forward [%d]", msg_id) - call append(0, split(substitute(msg.template, "\r", "", "g"), "\n")) + call append(0, split(substitute(msg.raw, "\r", "", "g"), "\n")) silent execute "$d" setlocal filetype=himalaya-msg-write let &modified = 0