chiark / gitweb /
Derive YourOptionsMenuContents::fix_widths with derive-adhoc
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 4 Feb 2024 20:36:13 +0000 (20:36 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 4 Feb 2024 20:38:09 +0000 (20:38 +0000)
Cargo.lock
Cargo.toml
src/main.rs
src/options.rs
src/text.rs

index e3714b13bc7099a8dc07d4e1bf655a5ae8e0c63f..186dde65118bab9e61f2a3b644852edf2d160e02 100644 (file)
@@ -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"
index 8167989c0b73c4c24330f45ae91c56d28a068d04..685c12d7e82d8ba3cd5ac4696c5eb795671a2fc0 100644 (file)
@@ -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"
index 57e3da068d78ce979f781c182da615be52b0545b..517a0fe5d62fae2f611e8e5e1d4ae8b442bfc031 100644 (file)
@@ -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;
index 72838e442989814cbcde85f1d6e92e9b39c58f75..5d9faa9c5dcb4ed96d9bc27f0b4191654a5f4b6f 100644 (file)
@@ -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<String>, // N
     cl_default_vis: CyclingMenuLine<Visibility>,
@@ -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 {
index f8455502aaf228b9ab28f9cea59a860b89464fb2..9c72feb12c18dbe1cb4cd4d0e3c608f9255eb78a 100644 (file)
@@ -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,