diff --git a/apps/ely-doc/src/tests.rs b/apps/ely-doc/src/tests.rs index ab0a07d..8aacaf7 100644 --- a/apps/ely-doc/src/tests.rs +++ b/apps/ely-doc/src/tests.rs @@ -365,7 +365,7 @@ fn a_macro_file_opens_in_risk_mode_and_saves_only_as_a_copy() { ); cx.update(|app| { assert!( - !docs.read(app).active_tab().expect("a tab").risk.is_some(), + docs.read(app).active_tab().expect("a tab").risk.is_none(), "the DOCX copy holds no macros" ) }); diff --git a/apps/ely-pdf/src/protect.rs b/apps/ely-pdf/src/protect.rs index d2e01f8..12f41db 100644 --- a/apps/ely-pdf/src/protect.rs +++ b/apps/ely-pdf/src/protect.rs @@ -236,7 +236,8 @@ impl Viewer { } fn protect_rows(&self, on: bool, user: &Entity, owner: &Entity, allow: u32, this: &Entity, cx: &mut Context) -> AnyElement { - let set = |change: Box| { + type Change = Box; + let set = |change: Change| { let this = this.clone(); move |value: bool, _: &mut Window, cx: &mut App| { this.update(cx, |viewer, cx| { diff --git a/apps/ely-pdf/src/sign.rs b/apps/ely-pdf/src/sign.rs index 2f8a4c4..4e073f5 100644 --- a/apps/ely-pdf/src/sign.rs +++ b/apps/ely-pdf/src/sign.rs @@ -57,12 +57,11 @@ impl PdfView { self.off( move |worker| { let fields = worker.signatures(doc, &path)?; - Ok(fields.into_iter().map(|field| { + Ok(Iterator::collect::>(fields.into_iter().map(|field| { let chain = field.signed.as_ref().map(|signed| signed.certs.clone()).filter(|certs| !certs.is_empty()); let trust = chain.map(|chain| trust::check(&chain).map_err(|error| error.to_string())); Checked { field, trust } - })) - .map(Iterator::collect::>) + }))) }, move |view, read: io::Result>, cx| { view.reading_signatures = false; diff --git a/apps/ely-pdf/src/tests/output.rs b/apps/ely-pdf/src/tests/output.rs index 2ed42a2..77a4c6a 100644 --- a/apps/ely-pdf/src/tests/output.rs +++ b/apps/ely-pdf/src/tests/output.rs @@ -76,7 +76,7 @@ fn a_damaged_file_opens_repaired_and_saves_as_a_new_file() { bytes.truncate(at); bytes.extend_from_slice(b"startxref\n9\n%%EOF\n"); std::fs::write(&path, &bytes).expect("writes"); - let (viewer, cx) = windowed(&mut cx, dir.path(), &[path.clone()], true); + let (viewer, cx) = windowed(&mut cx, dir.path(), std::slice::from_ref(&path), true); let view = shown(cx, &viewer); assert_eq!(cx.update(|_, app| viewer.read(app).active_tab().and_then(|tab| tab.risk)), Some(ely_office::Risk::Repaired)); assert!(cx.update(|_, app| view.read(app).repair.as_ref().is_some_and(|report| !report.is_empty()))); @@ -158,7 +158,7 @@ fn a_picture_that_breaks_as_it_draws_stops_an_overwrite() { let dir = tempfile::tempdir().expect("a temp dir"); let mut cx = TestAppContext::single(); let (path, bytes) = broken_picture(dir.path(), 792.0, 600.0); - let (viewer, cx) = windowed(&mut cx, dir.path(), &[path.clone()], true); + let (viewer, cx) = windowed(&mut cx, dir.path(), std::slice::from_ref(&path), true); shown(cx, &viewer); settle(cx, |app| viewer.read(app).active_tab().and_then(|tab| tab.risk) == Some(ely_office::Risk::Repaired)); let id = cx.update(|_, app| viewer.read(app).core.tabs[0].id); @@ -184,7 +184,7 @@ fn a_picture_never_drawn_is_checked_before_an_overwrite() { let path = dir.path().join("long.pdf"); worker.save(doc, &path).expect("saves"); let bytes = std::fs::read(&path).expect("reads"); - let (viewer, cx) = windowed(&mut cx, dir.path(), &[path.clone()], true); + let (viewer, cx) = windowed(&mut cx, dir.path(), std::slice::from_ref(&path), true); shown(cx, &viewer); for _ in 0..10 { super::frames(cx); diff --git a/apps/ely-pdf/src/tests/sign.rs b/apps/ely-pdf/src/tests/sign.rs index 543bf9a..a8952e1 100644 --- a/apps/ely-pdf/src/tests/sign.rs +++ b/apps/ely-pdf/src/tests/sign.rs @@ -212,7 +212,7 @@ fn reopening_the_dialog_checks_the_file_as_it_is_now() { let dir = tempfile::tempdir().expect("a temp dir"); let mut cx = TestAppContext::single(); let path = signed(dir.path()); - let (viewer, cx) = windowed(&mut cx, dir.path(), &[path.clone()], true); + let (viewer, cx) = windowed(&mut cx, dir.path(), std::slice::from_ref(&path), true); let view = shown(cx, &viewer); let digest = |cx: &mut VisualTestContext| { cx.update(|_, app| viewer.update(app, |viewer, cx| viewer.show_signatures(true, cx))); diff --git a/apps/ely-pdf/src/viewer.rs b/apps/ely-pdf/src/viewer.rs index d8cc5c6..fba2605 100644 --- a/apps/ely-pdf/src/viewer.rs +++ b/apps/ely-pdf/src/viewer.rs @@ -69,7 +69,7 @@ impl Host for Viewer { } fn read_at(&self, tab: u64, cx: &gpui::App) -> Option { - self.tab(tab).map(|tab| tab.view.read(cx).doc.clone()) + self.tab(tab).map(|tab| tab.view.read(cx).doc) } fn observed(&mut self, id: u64, view: &Entity, cx: &mut Context) { diff --git a/apps/ely-pdf/src/visible.rs b/apps/ely-pdf/src/visible.rs index 688dbd7..582b872 100644 --- a/apps/ely-pdf/src/visible.rs +++ b/apps/ely-pdf/src/visible.rs @@ -45,8 +45,11 @@ pub struct Making { picture: Option<(PathBuf, f32)>, } +/// Points of each stroke. +type Strokes = Vec>; + /// Strokes moved to the corner, the longer side 1. -pub fn fitted(strokes: &[Vec<(f32, f32)>]) -> Option<(Vec>, f32)> { +pub fn fitted(strokes: &[Vec<(f32, f32)>]) -> Option<(Strokes, f32)> { if strokes.iter().all(|stroke| stroke.len() < 2) { return None; } diff --git a/apps/ely-show/src/insert.rs b/apps/ely-show/src/insert.rs index 8683745..9bc2300 100644 --- a/apps/ely-show/src/insert.rs +++ b/apps/ely-show/src/insert.rs @@ -172,7 +172,7 @@ mod tests { _ => None, }); let names: Vec<_> = names.collect(); - (names.iter().any(|name| *name == media), names.len()) + (names.contains(&media), names.len()) }); assert_eq!(offered, ely_platform::media::BUILT); assert!(total >= 11, "the rest stay: {total}"); diff --git a/apps/ely-table/src/book.rs b/apps/ely-table/src/book.rs index 164dbe8..2eb951c 100644 --- a/apps/ely-table/src/book.rs +++ b/apps/ely-table/src/book.rs @@ -419,6 +419,8 @@ fn frozen_index(state: Option<&str>) -> Option { (index > 0).then_some(index) } +impl Zooming for Book {} + #[cfg(test)] mod tests { #[test] @@ -428,5 +430,3 @@ mod tests { assert_eq!(super::frozen_index(None), None); } } - -impl Zooming for Book {} diff --git a/apps/ely-tree/src/asks.rs b/apps/ely-tree/src/asks.rs index eb20ef3..d432a07 100644 --- a/apps/ely-tree/src/asks.rs +++ b/apps/ely-tree/src/asks.rs @@ -251,8 +251,7 @@ impl Tree { let (title, go) = (label("tree.branch.title"), label("tree.branch.create")); Some(self.form( "tree-new-branch", - title, - go, + (title, go), rows, Some(toggle.into_any_element()), dismiss, @@ -271,7 +270,7 @@ impl Tree { div().w_full().child(Input::new(message)), ); let (title, go) = (label("tree.tag.title"), label("tree.tag.create")); - Some(self.form("tree-new-tag", title, go, rows, None, dismiss, cx)) + Some(self.form("tree-new-tag", (title, go), rows, None, dismiss, cx)) } Ask::Rename { old, name, .. } => { let label = |key: &str| text(cx, key, &[]); @@ -283,7 +282,7 @@ impl Tree { text(cx, "tree.rename.title", &[("name", old)]), label("tree.rename.go"), ); - Some(self.form("tree-rename", title, go, rows, None, dismiss, cx)) + Some(self.form("tree-rename", (title, go), rows, None, dismiss, cx)) } Ask::Stash { .. } | Ask::Remote { .. } @@ -347,8 +346,7 @@ impl Tree { pub(crate) fn form( &self, id: &'static str, - title: gpui::SharedString, - go: gpui::SharedString, + (title, go): (gpui::SharedString, gpui::SharedString), rows: DescriptionList, extra: Option, dismiss: impl Fn(&mut Window, &mut App) + 'static, diff --git a/apps/ely-tree/src/asks_places.rs b/apps/ely-tree/src/asks_places.rs index 3fd3fe6..dc50e30 100644 --- a/apps/ely-tree/src/asks_places.rs +++ b/apps/ely-tree/src/asks_places.rs @@ -56,7 +56,7 @@ impl Tree { }, ); let (title, go) = (label("tree.stash.title"), label("tree.stash.go")); - self.form("tree-stash", title, go, rows, Some(extra), dismiss, cx) + self.form("tree-stash", (title, go), rows, Some(extra), dismiss, cx) } Ask::Remote { old, name, url, .. } => { let rows = DescriptionList::new() @@ -73,7 +73,7 @@ impl Tree { None => label("tree.remote.add"), }; let go = label("tree.remote.save"); - self.form("tree-remote", title, go, rows, None, dismiss, cx) + self.form("tree-remote", (title, go), rows, None, dismiss, cx) } Ask::Worktree { path, branch, new, .. @@ -90,7 +90,7 @@ impl Tree { let shown = path.display().to_string(); let title = text(cx, "tree.worktree.title", &[("path", &shown)]); let go = label("tree.worktree.go"); - self.form("tree-worktree", title, go, rows, Some(extra), dismiss, cx) + self.form("tree-worktree", (title, go), rows, Some(extra), dismiss, cx) } Ask::Force { repo, plan } => { let lost = match plan.lost.len() { diff --git a/apps/ely-tree/src/committing.rs b/apps/ely-tree/src/committing.rs index c638684..f5813c3 100644 --- a/apps/ely-tree/src/committing.rs +++ b/apps/ely-tree/src/committing.rs @@ -150,11 +150,10 @@ impl Tree { (self.amend, self.draft) = (false, None); self.fill("", "", cx); } - } else if let Some(opened) = self.opened_mut(id) { - if commit::message(&opened.held.subject, &opened.held.body) == message { + } else if let Some(opened) = self.opened_mut(id) + && commit::message(&opened.held.subject, &opened.held.body) == message { opened.held = Held::default(); } - } cx.notify(); } diff --git a/apps/ely-tree/src/hist.rs b/apps/ely-tree/src/hist.rs index 08dec4a..2e27ed5 100644 --- a/apps/ely-tree/src/hist.rs +++ b/apps/ely-tree/src/hist.rs @@ -253,7 +253,7 @@ impl Tree { pub fn search(&mut self, cx: &mut Context) { let Some(id) = self.active else { return }; let text = self.search.read(cx).text().trim().to_string(); - let query = (!text.is_empty()).then(|| Query { + let query = (!text.is_empty()).then_some(Query { find: self.find, text, }); diff --git a/apps/ely-tree/src/hist_pane.rs b/apps/ely-tree/src/hist_pane.rs index 3feaf44..5e53b4d 100644 --- a/apps/ely-tree/src/hist_pane.rs +++ b/apps/ely-tree/src/hist_pane.rs @@ -195,10 +195,8 @@ impl Tree { /// Pick, revert, or branch or tag at this commit. fn commit_actions(&self, detail: &Detail, cx: &mut Context) -> AnyElement { let (id, parents) = (detail.id.clone(), detail.parents.len()); - let acts: [( - &str, - Box)>, - ); 4] = [ + type Act = Box)>; + let acts: [(&str, Act); 4] = [ ("tree.commit.pick_it", { let id = id.clone(); Box::new(move |tree, _, cx| tree.cherry_pick(&id, parents, cx)) diff --git a/apps/ely-tree/src/look.rs b/apps/ely-tree/src/look.rs index 703e55d..be74412 100644 --- a/apps/ely-tree/src/look.rs +++ b/apps/ely-tree/src/look.rs @@ -13,6 +13,9 @@ use crate::{ tree::Tree, }; +/// A commit and its added and removed line counts. +type Row = (Commit, Option<(usize, usize)>); + pub enum Look { FileLog { repo: u64, @@ -20,7 +23,7 @@ pub enum Look { serial: u64, path: String, touches: Option, String>>, - rows: Rc)>>, + rows: Rc>, picked: Option, view: Option>, }, diff --git a/apps/ely-tree/src/recover.rs b/apps/ely-tree/src/recover.rs index bbde5cb..588650f 100644 --- a/apps/ely-tree/src/recover.rs +++ b/apps/ely-tree/src/recover.rs @@ -18,7 +18,7 @@ pub fn records(bytes: &[u8], n: usize) -> io::Result>> { if fields.last() == Some(&"") { fields.pop(); } - if fields.len() % n != 0 { + if !fields.len().is_multiple_of(n) { return Err(bad(text)); } Ok(fields.chunks(n).map(<[&str]>::to_vec).collect()) diff --git a/apps/ely-tree/src/tests.rs b/apps/ely-tree/src/tests.rs index 7467d76..fc2fc3d 100644 --- a/apps/ely-tree/src/tests.rs +++ b/apps/ely-tree/src/tests.rs @@ -53,7 +53,9 @@ pub(crate) fn committed(dir: &Path) -> PathBuf { root } -fn paths(files: &[Changed]) -> Vec<(&str, GitStatus, Option<(usize, usize)>)> { +type Listed<'a> = (&'a str, GitStatus, Option<(usize, usize)>); + +fn paths(files: &[Changed]) -> Vec> { files .iter() .map(|file| (file.path.as_ref(), file.status, file.lines)) diff --git a/crates/ely-office/src/lib.rs b/crates/ely-office/src/lib.rs index bde1731..46f2d38 100644 --- a/crates/ely-office/src/lib.rs +++ b/crates/ely-office/src/lib.rs @@ -273,19 +273,6 @@ pub fn outward(uri: &str) -> bool { .any(|scheme| uri.get(..scheme.len()).is_some_and(|head| head.eq_ignore_ascii_case(scheme))) } -#[cfg(test)] -mod outward_tests { - #[test] - fn web_and_mail_go_out_in_any_case() { - for uri in ["https://a.example/", "HTTPS://a.example/", "Http://a.example/", "MAILTO:x@a.example"] { - assert!(super::outward(uri), "{uri}"); - } - for uri in ["ftp://a.example/", "file:///etc/passwd", "javascript:alert(1)", "httpsx://a", "ht", "\u{e9}https://"] { - assert!(!super::outward(uri), "{uri}"); - } - } -} - /// A localized message. pub fn text(cx: &App, key: &str, args: &[(&str, &str)]) -> SharedString { ely_ui::i18n::text(cx, key, args) @@ -402,3 +389,16 @@ pub trait Tabs: Host { } impl Tabs for H {} + +#[cfg(test)] +mod outward_tests { + #[test] + fn web_and_mail_go_out_in_any_case() { + for uri in ["https://a.example/", "HTTPS://a.example/", "Http://a.example/", "MAILTO:x@a.example"] { + assert!(super::outward(uri), "{uri}"); + } + for uri in ["ftp://a.example/", "file:///etc/passwd", "javascript:alert(1)", "httpsx://a", "ht", "\u{e9}https://"] { + assert!(!super::outward(uri), "{uri}"); + } + } +} diff --git a/crates/ely-pdf-engine/tests/worker.rs b/crates/ely-pdf-engine/tests/worker.rs index ce85ef2..941e8c8 100644 --- a/crates/ely-pdf-engine/tests/worker.rs +++ b/crates/ely-pdf-engine/tests/worker.rs @@ -205,11 +205,12 @@ fn big_png(path: &Path, side: u32) { let mut raw = Vec::new(); let mut seed = 7u32; for _ in 0..side { - raw.push(0); - for _ in 0..side * 3 { + // Each row: filter byte none, then its noise. + let noise = (0..side * 3).map(|_| { seed = seed.wrapping_mul(1_103_515_245).wrapping_add(12_345); - raw.push((seed >> 16) as u8); - } + (seed >> 16) as u8 + }); + raw.extend(std::iter::once(0).chain(noise)); } // zlib with stored blocks; Adler-32 at the end. let mut zlib = vec![0x78, 0x01]; @@ -246,7 +247,7 @@ fn a_failed_open_keeps_no_memory() { }; // MuPDF's 256 MB store fills first; then nothing grows. for _ in 0..70 { - let refused = worker.open(&png).err().expect("not a PDF"); + let refused = worker.open(&png).expect_err("not a PDF"); assert!(refused.to_string().contains("not a PDF"), "{refused}"); } let before = rss(worker.pid()); diff --git a/crates/ely-platform/src/locale.rs b/crates/ely-platform/src/locale.rs index 8e2872c..9483b01 100644 --- a/crates/ely-platform/src/locale.rs +++ b/crates/ely-platform/src/locale.rs @@ -26,7 +26,7 @@ fn platform() -> String { #[cfg(target_os = "linux")] fn platform() -> String { - resolve_env(|key| env::value(key)) + resolve_env(env::value) } #[cfg(target_os = "windows")] diff --git a/crates/ely-ui/src/i18n.rs b/crates/ely-ui/src/i18n.rs index 93f6d40..c1ca35d 100644 --- a/crates/ely-ui/src/i18n.rs +++ b/crates/ely-ui/src/i18n.rs @@ -155,8 +155,11 @@ pub fn install_as(locale: &'static str, cx: &mut App) { ); } +/// Keys and messages of one language. +type Catalog = Vec<(&'static str, &'static str)>; + /// The English and Chinese catalogs, every module's messages. -fn catalogs() -> (Vec<(&'static str, &'static str)>, Vec<(&'static str, &'static str)>) { +fn catalogs() -> (Catalog, Catalog) { let en: Vec<_> = EN .iter() .chain(office::EN) diff --git a/crates/ely-ui/src/settings/storage.rs b/crates/ely-ui/src/settings/storage.rs index 4b5c99d..7f710f0 100644 --- a/crates/ely-ui/src/settings/storage.rs +++ b/crates/ely-ui/src/settings/storage.rs @@ -18,10 +18,13 @@ use gpui::{AnyElement, App, Context, IntoElement, SharedString, WeakEntity}; use super::window::SettingsView; use crate::i18n::text; +/// Each kind's size, and whether a clear waits. +type Usage = Vec<(Kind, u64, bool)>; + /// Last read sizes and limits; a clear waiting or failed. #[derive(Default)] pub(crate) struct Storage { - usage: Option, SharedString>>, + usage: Option>, limits: Option>, /// A clear waiting for the user's yes. confirming: Option, diff --git a/crates/ely-web-content/examples/webprobe.rs b/crates/ely-web-content/examples/webprobe.rs index 7e5a93e..23051ee 100644 --- a/crates/ely-web-content/examples/webprobe.rs +++ b/crates/ely-web-content/examples/webprobe.rs @@ -179,7 +179,7 @@ impl Probe { cx.background_executor() .timer(Duration::from_millis(500)) .await; - let _ = view.update(cx, |view, _| view.run_js("report('edited')")); + view.update(cx, |view, _| view.run_js("report('edited')")); }) .detach(); } diff --git a/crates/ely-web-content/src/engine.rs b/crates/ely-web-content/src/engine.rs index 08b9bfe..fdbd106 100644 --- a/crates/ely-web-content/src/engine.rs +++ b/crates/ely-web-content/src/engine.rs @@ -284,7 +284,7 @@ pub fn start(data: &Path, cx: &mut App) -> Result<()> { let why = held(&cache).unwrap_or_else(|| "CEF did not initialize".into()); log::error!("web: {why}"); *FAILED.lock().expect("the start lock") = Some(why); - cx.update(|cx| crate::view::deliver(cx)); + cx.update(crate::view::deliver); return; } log::info!("web: CEF started, cache {}", cache.display()); @@ -310,7 +310,7 @@ pub fn start(data: &Path, cx: &mut App) -> Result<()> { run_later(); make_browsers(); do_message_loop_work(); - cx.update(|cx| crate::view::deliver(cx)); + cx.update(crate::view::deliver); // As cefclient: CEF does not ask for all work. due = Some(FALLBACK); } diff --git a/crates/ely-web-content/src/handlers.rs b/crates/ely-web-content/src/handlers.rs index f429dae..9d87ef2 100644 --- a/crates/ely-web-content/src/handlers.rs +++ b/crates/ely-web-content/src/handlers.rs @@ -314,7 +314,7 @@ wrap_load_handler! { failed_url: Option<&CefString>, ) { // A stopped load is no failure; a fenced one is. - if !frame.is_some_and(|frame| frame.is_main() == 1) || error_code == Errorcode::ABORTED { + if frame.is_none_or(|frame| frame.is_main() != 1) || error_code == Errorcode::ABORTED { return; } let text = error_text.map(CefString::to_string).unwrap_or_default(); diff --git a/crates/ely-web-content/src/view.rs b/crates/ely-web-content/src/view.rs index 5ad9fef..c12e6c5 100644 --- a/crates/ely-web-content/src/view.rs +++ b/crates/ely-web-content/src/view.rs @@ -64,9 +64,12 @@ pub struct WebView { /// Shown instead of the page until reloaded. fault: Option, /// Takes a paste before the page; true when it did. - pub(crate) paste: Option bool>>, + pub(crate) paste: Option, } +/// Takes a paste before the page; true when it did. +pub(crate) type Paste = std::rc::Rc bool>; + impl EventEmitter for WebView {} impl Focusable for WebView {