diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 743bac3..fdd1109 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,18 +14,6 @@ env: CARGO_TERM_COLOR: always jobs: - test: - name: Tests - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v4 - - name: Install toolchain - uses: dtolnay/rust-toolchain@nightly - - name: Run cargo test - run: cargo test - - clippy_check: name: Clippy runs-on: ubuntu-latest diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 5d0792e..8e12ff9 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -6,7 +6,7 @@ on: - '*' env: - binary: rust-template + binary: rofi-edit jobs: @@ -26,14 +26,14 @@ jobs: - name: Upload binaries to artifacts uses: actions/upload-artifact@v3 with: - path: target/x86_64-unknown-linux-gnu/release/${{ env.binary }} - name: ${{ env.binary }} + path: target/x86_64-unknown-linux-gnu/release/${{ env.binary }}.so + name: ${{ env.binary }}.so retention-days: 1 - name: Upload binaries to release uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: ${{ env.binary }} - asset_name: ${{ env.binary }}-linux-${{ steps.get_version.outputs.tag }} + file: ${{ env.binary }}.so + asset_name: ${{ env.binary }}-linux-${{ steps.get_version.outputs.tag }}.so tag: ${{ github.ref }} overwrite: true diff --git a/Cargo.lock b/Cargo.lock index 5739ebe..043c16f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,19 +3,10 @@ version = 3 [[package]] -name = "addr2line" -version = "0.21.0" +name = "anyhow" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "autocfg" @@ -23,21 +14,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -45,49 +21,234 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bytes" -version = "1.5.0" +name = "bitflags" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] -name = "cc" -version = "1.0.83" +name = "cairo-rs" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "ab3603c4028a5e368d09b51c8b624b9a46edcd7c3778284077a6125af73c9f0a" dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "glib", "libc", + "once_cell", + "thiserror", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "cairo-sys-rs" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "691d0c66b1fb4881be80a760cb8fe76ea97218312f9dfe2c9cc0f496ca279cb1" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] [[package]] -name = "gimli" -version = "0.28.1" +name = "cfg-expr" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" +dependencies = [ + "smallvec", + "target-lexicon", +] [[package]] -name = "hermit-abi" -version = "0.3.3" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-executor" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-macro" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gio" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6973e92937cf98689b6a054a9e56c657ed4ff76de925e36fc331a15f0c5d30a" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ccf87c30a12c469b6d958950f6a9c09f2be20b7773f7e70d20b867fdf2628c3" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fad45ba8d4d2cea612b432717e834f48031cd8853c8aaf43b2c79fec8d144b" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca5c79337338391f1ab8058d6698125034ce8ef31b72a442437fa6c8580de26" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d80aa6ea7bba0baac79222204aa786a6293078c210abe69ef1336911d4bdc4f0" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "gobject-sys" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd34c3317740a6358ec04572c1bcfd3ac0b5b6529275fae255b237b314bb8062" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown", +] [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "libc" @@ -95,77 +256,12 @@ version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - [[package]] name = "memchr" version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.19.0" @@ -173,32 +269,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "overload" -version = "0.1.1" +name = "pango" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "35be456fc620e61f62dff7ff70fbd54dcbaf0a4b920c0f16de1107c47d921d48" dependencies = [ - "lock_api", - "parking_lot_core", + "bitflags 1.3.2", + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", ] [[package]] -name = "parking_lot_core" -version = "0.9.9" +name = "pango-sys" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "3da69f9f3850b0d8990d462f8c709561975e95f689c1cdf0fecdebde78b35195" dependencies = [ - "cfg-if", + "glib-sys", + "gobject-sys", "libc", - "redox_syscall", - "smallvec", - "windows-targets", + "system-deps", ] [[package]] @@ -207,6 +300,52 @@ version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.70" @@ -226,30 +365,37 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags", -] - -[[package]] -name = "rust-template" +name = "rofi-edit" version = "0.1.0" dependencies = [ + "rofi-mode", "serde", "serde_json", - "tokio", - "tracing", - "tracing-subscriber", ] [[package]] -name = "rustc-demangle" -version = "0.1.23" +name = "rofi-mode" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "1b8965aa7c7313bececbd2d43f7ced6060a8b146ad807f3371c8eeb0518b06ba" +dependencies = [ + "bitflags 2.4.1", + "cairo-rs", + "libc", + "pango", + "rofi-plugin-sys", +] + +[[package]] +name = "rofi-plugin-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bf28cd51980f7033bd1c1607f98ae914184c21516f4e5583030e161efe81b01" +dependencies = [ + "bitflags 2.4.1", + "cairo-sys-rs", + "glib-sys", +] [[package]] name = "ryu" @@ -257,12 +403,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - [[package]] name = "serde" version = "1.0.193" @@ -280,7 +420,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -295,21 +435,21 @@ dependencies = [ ] [[package]] -name = "sharded-slab" -version = "0.1.7" +name = "serde_spanned" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ - "lazy_static", + "serde", ] [[package]] -name = "signal-hook-registry" -version = "1.4.1" +name = "slab" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ - "libc", + "autocfg", ] [[package]] @@ -319,13 +459,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] -name = "socket2" -version = "0.5.5" +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "libc", - "windows-sys", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -340,100 +481,87 @@ dependencies = [ ] [[package]] -name = "thread_local" -version = "1.1.7" +name = "system-deps" +version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" dependencies = [ - "cfg-if", - "once_cell", + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", ] [[package]] -name = "tokio" -version = "1.34.0" +name = "target-lexicon" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys", + "thiserror-impl", ] [[package]] -name = "tokio-macros" -version = "2.2.0" +name = "thiserror-impl" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] -name = "tracing" -version = "0.1.40" +name = "toml" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.21.0", ] [[package]] -name = "tracing-attributes" -version = "0.1.27" +name = "toml_datetime" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ - "proc-macro2", - "quote", - "syn", + "serde", ] [[package]] -name = "tracing-core" -version = "0.1.32" +name = "toml_edit" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "once_cell", - "valuable", + "indexmap", + "toml_datetime", + "winnow", ] [[package]] -name = "tracing-log" -version = "0.2.0" +name = "toml_edit" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] @@ -443,16 +571,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] -name = "valuable" -version = "0.1.0" +name = "version-compare" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "version_check" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "winapi" @@ -477,67 +605,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.48.0" +name = "winnow" +version = "0.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" dependencies = [ - "windows-targets", + "memchr", ] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/Cargo.toml b/Cargo.toml index fc191c0..8cc5845 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,17 +1,17 @@ [package] -name = "rust-template" +name = "rofi-edit" version = "0.1.0" edition = "2021" -description = "A template for rust projects" +description = "A plugin for rofi that allows list editing" authors = ["DavidOnTop "] readme = "README.md" -documentation = "https://docs.rs/rust-template" -license = "MIT" -repository = "git@github.com:davidon-top/rust-template.git" +license = "GPL-3.0" +repository = "git@github.com:davidon-top/rofi-edit.git" + +[lib] +crate-type = ["cdylib"] [dependencies] -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -tracing = "0.1" -tracing-subscriber = "0.3" -tokio = { version = "1.0", features = ["full"] } +rofi-mode = "0.3.1" +serde = { version = "1.0.193", features = ["derive"] } +serde_json = "1.0.108" diff --git a/LICENSE-GLWTPL b/LICENSE-GLWTPL deleted file mode 100644 index 3c3602f..0000000 --- a/LICENSE-GLWTPL +++ /dev/null @@ -1,26 +0,0 @@ - GLWTS(Good Luck With That Shit) Public License - Copyright (c) Every-fucking-one - -Everyone is permitted to copy, distribute, modify, merge, sell, publish, -sublicense or whatever the fuck they want with this software but at their -OWN RISK. - - Preamble - -The author has absolutely no fucking clue what the code in this project -does. It might just fucking work or not, there is no third option. - - - GOOD LUCK WITH THAT SHIT PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION, AND MODIFICATION - - 0. You just DO WHATEVER THE FUCK YOU WANT TO as long as you NEVER LEAVE -A FUCKING TRACE TO TRACK THE AUTHOR of the original product to blame for -or held responsible. - -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - -Good luck and Godspeed. diff --git a/LICENSE-MIT b/LICENSE-MIT deleted file mode 100644 index 9b84d0d..0000000 --- a/LICENSE-MIT +++ /dev/null @@ -1,22 +0,0 @@ -MIT License - -Copyright (c) 2023 DavidOnTop - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/README.md b/README.md index 448d0e5..0b0b767 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# Template repo +# Rofi edit plugin diff --git a/src/lib.rs b/src/lib.rs index 8b13789..8727b85 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,301 @@ +use std::io::Read; +#[derive(serde::Deserialize, serde::Serialize)] +struct ItemContainer { + name: String, + item: Item, +} + +#[derive(serde::Deserialize, serde::Serialize)] +enum Item { + Bool { + #[serde(default)] + value: bool, + }, + Int { + #[serde(default)] + value: i64, + min: Option, + max: Option, + }, + Float { + #[serde(default)] + value: f64, + min: Option, + max: Option, + }, + String { + #[serde(default)] + value: String, + }, + Enum { + #[serde(default)] + value: usize, + options: Vec, + } +} + +impl Item { + fn get_value(&self) -> String { + match self { + Item::Bool { value } => value.to_string(), + Item::Int { value, .. } => value.to_string(), + Item::Float { value, .. } => value.to_string(), + Item::String { value } => value.clone(), + Item::Enum { value, options } => options[*value].clone(), + } + } +} + +enum State { + Main, + Editing(usize), +} + +struct Mode<'rofi> { + api: rofi_mode::Api<'rofi>, + entries: Vec, + items: Vec, + state: State, + message: String, +} + +impl<'rofi> Mode<'rofi> { + fn entries_from_items(&mut self) { + self.state = State::Main; + self.api.set_display_name("edit"); + self.entries.clear(); + self.items.iter().for_each(|item| { + self.entries.push(format!("{}: {}", item.name, item.item.get_value())); + }); + self.entries.push("Apply".to_string()); + } + + fn enter_edit(&mut self, item: usize) -> String { + self.state = State::Editing(item); + let item = &self.items[item]; + self.api.set_display_name(format!("editing {}", item.name)); + self.message = format!("Old value: {}", item.item.get_value()); + self.entries.clear(); + match &item.item { + Item::Bool { .. } => { + self.entries.push("true".to_string()); + self.entries.push("false".to_string()); + }, + Item::Int { value, min, max } => { + let min = min.map(|min| format!("Min: {};", min)).unwrap_or("".to_string()); + let max = max.map(|max| format!("Max: {};", max)).unwrap_or("".to_string()); + self.message = format!("Old value: {};\r{} {}", value, min, max); + }, + Item::Float { value, min, max } => { + let min = min.map(|min| format!("Min: {};", min)).unwrap_or("".to_string()); + let max = max.map(|max| format!("Max: {};", max)).unwrap_or("".to_string()); + self.message = format!("Old value: {};\r{} {}", value, min, max); + }, + Item::String { .. } => {}, + Item::Enum { options, .. } => { + options.iter().for_each(|option| self.entries.push(option.clone())); + }, + } + self.entries.push("Cancel".to_string()); + return item.item.get_value(); + } + + fn finish_edit(&mut self, selected: Option, custom_input: Option<&mut rofi_mode::String>) { + match self.state { + State::Main => {panic!("finish_edit called in main state")}, + State::Editing(item) => { + let item = &mut self.items[item]; + match item.item { + Item::Bool { .. } => { + match selected { + Some(0) => item.item = Item::Bool { value: true }, + Some(1) => item.item = Item::Bool { value: false }, + _ => {}, + } + }, + Item::Int { value, min, max } => { + let mut new_value = value.clone(); + if let Some(input) = custom_input { + new_value = input.replace("\\-", "-").parse().unwrap(); + } + if let Some(min) = min { + if new_value < min { + new_value = min; + } + } + if let Some(max) = max { + if new_value > max { + new_value = max; + } + } + item.item = Item::Int { value: new_value, min, max }; + }, + Item::Float { value, min, max } => { + let mut new_value = value.clone(); + if let Some(input) = custom_input { + new_value = input.replace("\\-", "-").parse().unwrap(); + } + if let Some(min) = min { + if new_value < min { + new_value = min; + } + } + if let Some(max) = max { + if new_value > max { + new_value = max; + } + } + item.item = Item::Float { value: new_value, min, max }; + }, + Item::String { .. } => { + if let Some(input) = custom_input { + item.item = Item::String { value: input.into() }; + } + }, + Item::Enum { ref mut value, .. } => { + if let Some(selected) = selected { + *value = selected; + } + }, + }; + self.entries_from_items(); + }, + } + } + + fn print_items(&self) { + println!("{}", serde_json::to_string(&self.items).unwrap()); + } +} + +// reads until 2 subsequent newlines +fn read_stdin() -> String { + let mut inp = Vec::new(); + let mut buf = [0u8; 1]; + let mut handle = std::io::stdin().lock(); + loop { + handle.read_exact(&mut buf).unwrap(); + inp.push(buf[0]); + if inp.ends_with(b"\n\n") { + break; + } + } + String::from_utf8(inp).unwrap() +} + +impl<'rofi> rofi_mode::Mode<'rofi> for Mode<'rofi> { + const NAME: &'static str = "edit\0"; + + fn init(mut api: rofi_mode::Api<'rofi>) -> Result { + api.set_display_name("edit"); + let args = std::env::args().into_iter().collect::>(); + + + if args.contains(&"--edit-help".to_string()) { + eprintln!(r#" +--edit-stdin Read input from stdin, reads json until 2 newlines +--edit-file Read input from file, json file +--edit-input Read input, should be a string containing json +--edit-example Prints examples + "#); + return Err(()); + } + if args.contains(&"--edit-example".to_string()) { + let mut its: Vec = Vec::new(); + its.push(ItemContainer { name: "bool item".to_string(), item: Item::Bool { value: false } }); + its.push(ItemContainer { name: "int item".to_string(), item: Item::Int { value: 0, min: Some(0), max: None } }); + its.push(ItemContainer { name: "float item".to_string(), item: Item::Float { value: 0.0, min: None, max: Some(69.0) } }); + its.push(ItemContainer { name: "string item".to_string(), item: Item::String { value: "hello".to_string() } }); + its.push(ItemContainer { name: "enum items".to_string(), item: Item::Enum { value: 0, options: vec!["opt1".into(), "opt2".into(), "other_opt".into()] } }); + eprintln!("Example input:\n{}\n\nOutput is the same with changed value keys\nKeys with value of null can be omited", serde_json::to_string_pretty(&its).unwrap()); + return Err(()); + } + let items: Vec = if args.contains(&"--edit-stdin".to_string()) { + let res = read_stdin(); + serde_json::from_str(&res).unwrap() + } else if let Some(file_pos) = args.iter().position(|arg| *arg == "--edit-file".to_string()) { + let fp = args[file_pos + 1].clone(); + let res = std::fs::read_to_string(fp).unwrap(); + serde_json::from_str(&res).unwrap() + } else if let Some(input_pos) = args.iter().position(|arg| *arg == "--edit-input".to_string()) { + let res = args[input_pos + 1].clone(); + serde_json::from_str(&res).unwrap() + } else { + eprintln!("No input specified, use --edit-help for help"); + return Err(()); + }; + let mut s = Self { + api, + entries: Vec::with_capacity(items.len() + 1), + items, + state: State::Main, + message: String::new(), + }; + s.entries_from_items(); + Ok(s) + } + + fn entries(&mut self) -> usize { + self.entries.len() + } + + fn entry_content(&self, line: usize) -> rofi_mode::String { + self.entries[line].clone().into() + } + + fn react(&mut self, event: rofi_mode::Event, input: &mut rofi_mode::String) -> rofi_mode::Action { + match event { + rofi_mode::Event::Cancel { .. } => { + if let State::Editing(item) = self.state { + *input = "".into(); + self.entries_from_items(); + } else { + self.print_items(); + return rofi_mode::Action::Exit; + } + }, + rofi_mode::Event::Ok { selected, .. } => { + if let State::Editing(item) = self.state { + self.finish_edit(Some(selected), None); + } else { + if selected == self.entries() - 1 { + self.print_items(); + return rofi_mode::Action::Exit; + } else { + self.enter_edit(selected); + } + } + }, + rofi_mode::Event::CustomInput { selected, .. } => { + if let State::Editing(item) = self.state { + self.finish_edit(None, Some(input)); + *input = "".into(); + } else { + *input = rofi_mode::format!(""); + } + }, + rofi_mode::Event::Complete { selected } => { + match selected { + None => {}, + Some(item) => { + *input = rofi_mode::format!("{}", self.entries[item]); + } + } + }, + rofi_mode::Event::DeleteEntry { selected } => {}, + rofi_mode::Event::CustomCommand { number, selected } => {}, + } + rofi_mode::Action::Reload + } + + fn matches(&self, line: usize, matcher: rofi_mode::Matcher<'_>) -> bool { + matcher.matches(&self.entries[line]) + } + + fn message(&mut self) -> rofi_mode::String { + self.message.clone().into() + } +} + +rofi_mode::export_mode!(Mode<'_>); diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index a30eb95..0000000 --- a/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -}