Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> # Conflicts: # apps/darkroom-android/Cargo.toml # apps/darkroom-desktop/Cargo.toml # platform/dr-plat/src/lib.rs
53 lines
2.3 KiB
Rust
53 lines
2.3 KiB
Rust
//! DarkRoom desktop entry point.
|
|
//!
|
|
//! darkroom-desktop <file-or-directory>...
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use dr_plat::diagnostics::Installed;
|
|
|
|
fn main() -> anyhow::Result<()> {
|
|
// Built rather than `init`ed, so the same logger can be handed to the
|
|
// diagnostics tee: `env_logger` keeps writing to stderr exactly as before,
|
|
// and every record it accepts is also appended to the on-disk log
|
|
// (NFR-OPS-1). `filter()` is asked afterwards because the environment may
|
|
// have overridden the default below, and the file must not be quieter than
|
|
// the terminal.
|
|
let console = env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(
|
|
"info,wgpu_core=warn,wgpu_hal=warn,zbus=warn,tracing=warn,calloop=warn,rawler=warn",
|
|
))
|
|
.build();
|
|
let level = console.filter();
|
|
let logging = dr_plat::diagnostics::install(Box::new(console), level);
|
|
|
|
// Immediately after the logger and before anything that could fail. Until
|
|
// now a panic on desktop went to stderr and died with the terminal, which
|
|
// means every panic a user has ever hit was unreportable: the process
|
|
// survives (the panicking worker does not), a control goes dead, and there
|
|
// is nothing on disk to say why. The record is local and stays local —
|
|
// there is no upload path, by design; see `dr_plat::crash`.
|
|
dr_plat::crash::install(env!("CARGO_PKG_VERSION"));
|
|
|
|
log::info!("DarkRoom v{}", env!("CARGO_PKG_VERSION"));
|
|
// First thing in the file, so a user asked for "the log" can find it
|
|
// without being told a path over the phone.
|
|
match &logging {
|
|
Installed::ToFile(path) => log::info!("logging to {}", path.display()),
|
|
Installed::ConsoleOnly(why) => log::warn!("no log file this session: {why}"),
|
|
}
|
|
|
|
let paths: Vec<PathBuf> = std::env::args().skip(1).map(PathBuf::from).collect();
|
|
if paths.is_empty() {
|
|
eprintln!("usage: darkroom-desktop <file-or-directory>...");
|
|
}
|
|
|
|
dr_ui::run(paths)?;
|
|
|
|
// Skip Rust's normal static/thread-local teardown on the way out: a
|
|
// background zbus/keyring connection opened by dr_ui::launch_ui can
|
|
// still be alive here, and unwinding through it races its async-io
|
|
// reactor thread, panicking with "thread local ... during or after
|
|
// destruction" when the window is closed.
|
|
std::process::exit(0);
|
|
}
|