/
nkolentcev
/
devscripts
Обзор
Документация
Войти
/
nkolentcev
/
devscripts
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
onec/tui/src/main.rs
99 строк
3 KB
Nikolay Kolentcev
orc: распознавание полных дистрибутивов + модалка прогресса с потоком
01 май 2026, 17:43
01 май 2026, 17:43
66d9872
Код
Авторство
О чём код?
mod app; mod creds; mod debug_total; mod download; mod parser; mod releases_client; mod ui; use std::path::PathBuf; use app::App; use creds::resolve_credentials; use parser::{parse_total_catalog_bytes, ParseError, ProjectRow}; use releases_client::ReleasesClient; fn main() -> Result<(), Box<dyn std::error::Error>> { creds::load_dotenv_files(); let args: Vec<String> = std::env::args().skip(1).collect(); let dump_total = args.iter().any(|a| a == "--dump-total"); let help = args.iter().any(|a| a == "--help" || a == "-h"); if help { eprintln!( "orc — TUI для releases.1c.ru\n\n\ Использование:\n orc запуск интерфейса\n\ orc --dump-total загрузить /total/, сохранить HTML и вывести диагностику в stderr\n\n\ Учётка: .env в cwd или выше по каталогам / рядом с orc (onec_login, onec_password), env, cred.cfg, keyring.\n\ Обход SSO: ORC_COOKIE / ONEC_SESSION_COOKIE — строка заголовка Cookie;\n\ ORC_COOKIE_FILE — одна строка Cookie или jar Netscape (curl -c), см. scripts/refresh-releases-session.sh.\n\ Дамп по умолчанию: ./orc-total-dump.html (переменная ORC_DUMP_PATH меняет путь).\n\ Подробный stderr: ORC_VERBOSE=1." ); return Ok(()); } let creds = resolve_credentials()?; let mut client = ReleasesClient::new(creds.login, creds.password)?; const CATALOG_URLS: &[&str] = &[ "total/?hideUnavailablePrograms=false", "total/", "total", ]; if dump_total { let mut dump_bytes: Option<Vec<u8>> = None; let mut last_fetch_err: Option<String> = None; for path in CATALOG_URLS { match client.get_path_bytes(path) { Ok(b) => { dump_bytes = Some(b); break; } Err(e) => last_fetch_err = Some(e.to_string()), } } let bytes = dump_bytes.ok_or_else(|| { last_fetch_err.unwrap_or_else(|| { "не удалось GET ни один из URL каталога (причина не записана)".into() }) })?; let dump_path = std::env::var("ORC_DUMP_PATH") .map(PathBuf::from) .unwrap_or_else(|_| PathBuf::from("orc-total-dump.html")); debug_total::run(&bytes, &dump_path)?; return Ok(()); } let mut projects: Option<Vec<ProjectRow>> = None; let mut last_err: Option<Box<dyn std::error::Error>> = None; for path in CATALOG_URLS { match client.get_path_bytes(path) { Ok(bytes) => match parse_total_catalog_bytes(&bytes) { Ok(p) => { projects = Some(p); break; } Err(e) => last_err = Some(e.into()), }, Err(e) => last_err = Some(e.into()), } } let projects = projects.ok_or_else(|| { last_err.unwrap_or_else(|| ParseError::NoProjectsOnPage.into()) })?; if projects.is_empty() { eprintln!( "Каталог пуст или разметка сайта изменилась. Проверьте логин и доступ к ИТС." ); } let mut app = App::new(projects, client); ui::run(&mut app)?; Ok(()) }