6.1 KiB
6.1 KiB
Ревью кода bropicker (2026-08-26) — ВЫПОЛНЕНО
Скоуп: src/main.rs (401 строка), src/config.rs (~210), src/winit.rs (45), ui/*.slint. Плюс вывод clippy.
Итог рефакторинга: main.rs 401→340 строк (и стал тонким по смыслу), появился launcher.rs, 12 юнит-тестов, tools/check.ps1 (fmt+clippy -D warnings +test) зелёный, дублирование запуска устранено, индекс из UI вместо поиска по имени, все P0-P2 закрыты. UI проверен скриншотом — идентичен.
P0 — мусор и артефакты правок (чинить сразу)
main.rs:141-142— дубльlet url = main_window.get_current_url()..(первый не используется; поймано clippy). Артефакт моих правок этапа D/Emain.rs:229-231—on_settings_clickedзарегистрирован дважды: мёртвый первый вариант сprintln!. Второй вызов перезаписывает, но мусор путает- Остатки
println!(строки 230, 268, 281, 304): в release никуда не пишут, в debug сорят. Либоconfig::log, либо удалить - Обратная конвертация
BrowserConfig → BrowserEntryтеряет emoji/icon (icon: String::new()в двух местах). На запуск не влияет, но это бомба: любая будущая фича, читающая поля из этой конвертации, получит пустышку
P1 — дублирование и SRP
- Дубль логики запуска:
on_launch_browserиon_open_clickedсовпадают на ~90% (лог + launch + remember + hide). Extract:fn launch_and_remember(&Config, &MainWindow, entry, url) - main.rs — файл-бог (401 строка): бутстрап + клей UI-моделей + запуск
браузеров + парсер флагов + иконки + remembered-логика. Разрезать:
-
launcher.rs— split_flags, launch, launch_and_remember -config.rsоставить: TOML + реестр + пути (или вынестиdetect.rs) -main.rs— тонкий: env, fast-path, show/run (~80 строк) - Ручные конвертации моделей ↔ конфиг дважды →
impl From<&BrowserConfig> for BrowserEntry(+ обратный From) - Поиск индекса по имени (
find(|b| b.name == browser.name)): ломается при одинаковых именах (два профиля «Chrome»). Правильно: передавать индекс из UI — в slint цикл уже знаетi:clicked => root.launch-browser(i) struct State: поля browser_model/remembered_model/config после init не читаются (Rc живут в замыканиях, модели — в свойствах окон). Оставить только окна, или убрать структуру вовсе
P2 — rust-way (clippy + идиоматика)
- clippy:
winit.rs:9match → if let;load_icon— collapse nested if let (cargo clippy --fixзакрывает все три) - Нет юнит-тестов. Чистые функции напрашиваются:
-
split_flags: кавычки с пробелами, пустая строка, двойные пробелы -domain_of: схема/без схемы/www/порт/путь/userinfo -extract_exe: кавычки, аргументы, относительный путь -is_known_browser: регистр, «Яндекс», подстрока в пути-подобном имени - В воркфлоу нет
cargo fmt/clippy— добавитьtools/check.ps1(fmt --check + clippy -D warnings + test) и гонять перед коммитом - Магические строки → константы: URL-плейсхолдер
"ku6epxboctuk.github.io", префикс лога"[bp]", имена env (BP_THEME/BP_CONFIG/BP_VIEW) Settings::defaultручной — заменить на#[derive(Default)]c#[default = true]-эквивалентом (serde default-функции уже есть)
P3 — косметика и Slint
ui/main.slint:1— неиспользуемые импортыButton, CheckBox(CheckRow их заменил)- Хардкод акцента
#3b82f6в 4 местах slint → токенTheme.accent theme.slint: неиспользуемые тени shadow-primary-x/y/blur, text-control-muted — проверить и вычиститьsettings.slint: строки браузеров и доменов почти одинаковые — общий компонент-строка (низкий приоритет, панелей всего две)- Лог без ротации: при желании — усечение до N КБ при старте
Что трогать НЕ нужно
unwrap()при создании окон в main — норм для startup-фейлов приложенияRc<RefCell<Config>>— осознанный выбор для однопоточного Slint (не тащить Mutex ради галочки)- Частота
config::saveна каждый чекбокс — частоты ничтожны
Порядок исполнения (одна сессия)
- P0 целиком + прогон clippy --fix (P2 первая строка)
- P1: launcher.rs + launch_and_remember + From-конвертации + индекс из UI
- Юнит-тесты чистых функций + tools/check.ps1
- P3 косметика: импорты, Theme.accent/danger токены
Каждый пункт — зелёный tools\check.ps1 перед коммитом.