From: Ian Jackson Date: Sun, 4 Feb 2024 20:36:13 +0000 (+0000) Subject: Derive YourOptionsMenuContents::fix_widths with derive-adhoc X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=57abaf29f0839f4dc2458587515cf006de49088b;p=mastodonochrome.git Derive YourOptionsMenuContents::fix_widths with derive-adhoc --- diff --git a/Cargo.lock b/Cargo.lock index e3714b1..186dde6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -178,6 +178,15 @@ dependencies = [ "wyz", ] +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.14.0" @@ -336,6 +345,15 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + [[package]] name = "crossbeam-deque" version = "0.8.4" @@ -392,6 +410,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "cssparser" version = "0.33.0" @@ -452,6 +480,43 @@ dependencies = [ "matches", ] +[[package]] +name = "derive-adhoc" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd539187faa4741d0b5cee4bfe866b655cbe3cf497ecbe60db60883108e19fb" +dependencies = [ + "derive-adhoc-macros", + "heck", +] + +[[package]] +name = "derive-adhoc-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0f27b6d3c8bc4e69b0e1091cfc38e3bb9e7b6d3dfc3703a1dd5c75d0a281e2a" +dependencies = [ + "heck", + "itertools 0.12.0", + "proc-macro-crate", + "proc-macro2", + "quote", + "sha3", + "strum", + "syn 2.0.43", + "void", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "dtoa" version = "1.0.9" @@ -616,6 +681,16 @@ dependencies = [ "byteorder", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.11" @@ -872,6 +947,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -966,6 +1050,7 @@ dependencies = [ "chrono", "clap", "crossterm", + "derive-adhoc", "email_address", "html2text", "itertools 0.12.0", @@ -1322,6 +1407,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "proc-macro-crate" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +dependencies = [ + "toml_datetime", + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.71" @@ -1667,6 +1762,16 @@ dependencies = [ "serde", ] +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + [[package]] name = "signal-hook" version = "0.3.17" @@ -1964,6 +2069,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + [[package]] name = "tower-service" version = "0.3.2" @@ -1995,6 +2117,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-bidi" version = "0.3.14" @@ -2075,6 +2203,12 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "want" version = "0.3.1" @@ -2329,6 +2463,15 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +[[package]] +name = "winnow" +version = "0.5.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "818ce546a11a9986bc24f93d0cdf38a8a1a400f1473ea8c82e59f6e0ffab9249" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" diff --git a/Cargo.toml b/Cargo.toml index 8167989..685c12d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ repository = "https://git.tartarus.org/?p=simon/mastodonochrome.git" chrono = { version = "0.4.31", features = ["serde"] } clap = { version = "4.4.12", features = ["derive"] } crossterm = "0.27.0" +derive-adhoc = "0.8.1" email_address = "0.2.4" html2text = { version = "0.11.0", features = ["css"] } itertools = "0.12.0" diff --git a/src/main.rs b/src/main.rs index 57e3da0..517a0fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,6 +26,9 @@ use clap::Parser; use std::process::ExitCode; +#[macro_use] +pub mod text; + pub mod activity_stack; pub mod auth; pub mod client; @@ -39,7 +42,6 @@ pub mod menu; pub mod options; pub mod posting; pub mod scan_re; -pub mod text; pub mod top_level_error; pub mod tui; pub mod types; diff --git a/src/options.rs b/src/options.rs index 72838e4..5d9faa9 100644 --- a/src/options.rs +++ b/src/options.rs @@ -8,6 +8,7 @@ use super::tui::{ ActivityState, CursorPosition, LogicalAction, OurKey, OurKey::*, }; use super::types::Visibility; +use derive_adhoc::Adhoc; struct YourOptionsMenu { title: FileHeader, @@ -16,6 +17,8 @@ struct YourOptionsMenu { c: YourOptionsMenuContents, } +#[derive(Adhoc)] +#[derive_adhoc(MenuContents)] struct YourOptionsMenuContents { el_display_name: EditableMenuLine, // N cl_default_vis: CyclingMenuLine, @@ -154,53 +157,7 @@ impl YourOptionsMenu { }; Ok(menu) } -} -impl YourOptionsMenuContents { - fn fix_widths(&mut self) -> (usize, usize) { - let mut lmaxwid = 0; - let mut rmaxwid = 0; - self.el_display_name - .check_widths(&mut lmaxwid, &mut rmaxwid); - self.cl_default_vis.check_widths(&mut lmaxwid, &mut rmaxwid); - self.el_default_language - .check_widths(&mut lmaxwid, &mut rmaxwid); - self.cl_default_sensitive - .check_widths(&mut lmaxwid, &mut rmaxwid); - self.cl_locked.check_widths(&mut lmaxwid, &mut rmaxwid); - self.cl_bot.check_widths(&mut lmaxwid, &mut rmaxwid); - self.cl_discoverable - .check_widths(&mut lmaxwid, &mut rmaxwid); - self.cl_hide_collections - .check_widths(&mut lmaxwid, &mut rmaxwid); - self.cl_indexable.check_widths(&mut lmaxwid, &mut rmaxwid); - - self.el_display_name.reset_widths(); - self.cl_default_vis.reset_widths(); - self.el_default_language.reset_widths(); - self.cl_default_sensitive.reset_widths(); - self.cl_locked.reset_widths(); - self.cl_bot.reset_widths(); - self.cl_discoverable.reset_widths(); - self.cl_hide_collections.reset_widths(); - self.cl_indexable.reset_widths(); - - self.el_display_name.ensure_widths(lmaxwid, rmaxwid); - self.cl_default_vis.ensure_widths(lmaxwid, rmaxwid); - self.el_default_language.ensure_widths(lmaxwid, rmaxwid); - self.cl_default_sensitive.ensure_widths(lmaxwid, rmaxwid); - self.cl_locked.ensure_widths(lmaxwid, rmaxwid); - self.cl_bot.ensure_widths(lmaxwid, rmaxwid); - self.cl_discoverable.ensure_widths(lmaxwid, rmaxwid); - self.cl_hide_collections.ensure_widths(lmaxwid, rmaxwid); - self.cl_indexable.ensure_widths(lmaxwid, rmaxwid); - - (lmaxwid, rmaxwid) - } -} - -// XXXX join these two impl blocks again -impl YourOptionsMenu { fn submit(&self, client: &mut Client) -> LogicalAction { let c = &self.c; let details = AccountDetails { diff --git a/src/text.rs b/src/text.rs index f845550..9c72feb 100644 --- a/src/text.rs +++ b/src/text.rs @@ -2,6 +2,7 @@ use chrono::NaiveDateTime; use chrono::{DateTime, Local, Utc}; use core::cmp::{max, min}; +use derive_adhoc::define_derive_adhoc; use std::collections::{BTreeMap, HashSet}; use std::ops::Add; use unicode_width::UnicodeWidthStr; @@ -2043,6 +2044,25 @@ fn test_filestatus_render() { ); } +pub trait MenuContents { + fn fix_widths(&mut self) -> (usize, usize); +} + +define_derive_adhoc! { + MenuContents for struct, expect items = + + impl<$tgens> MenuContents for $ttype where $twheres { + fn fix_widths(&mut self) -> (usize, usize) { + let mut lmaxwid = 0; + let mut rmaxwid = 0; + $( self.$fname.check_widths(&mut lmaxwid, &mut rmaxwid); ) + $( self.$fname.reset_widths(); ) + $( self.$fname.ensure_widths(lmaxwid, rmaxwid); ) + (lmaxwid, rmaxwid) + } + } +} + pub struct MenuKeypressLine { keypress: Keypress, lwid: usize,