main.rs

 1use fs::OpenOptions;
 2use log::LevelFilter;
 3use simplelog::SimpleLogger;
 4use std::{fs, path::PathBuf};
 5use zed::{
 6    assets, editor, file_finder, menus, settings,
 7    workspace::{self, OpenParams},
 8};
 9
10fn main() {
11    init_logger();
12
13    let app = gpui::App::new(assets::Assets).unwrap();
14    let (_, settings_rx) = settings::channel(&app.font_cache()).unwrap();
15    app.set_menus(menus::menus(settings_rx.clone()));
16    app.run(move |ctx| {
17        workspace::init(ctx);
18        editor::init(ctx);
19        file_finder::init(ctx);
20
21        if stdout_is_a_pty() {
22            ctx.platform().activate(true);
23        }
24
25        let paths = collect_path_args();
26        if !paths.is_empty() {
27            ctx.dispatch_global_action(
28                "workspace:open_paths",
29                OpenParams {
30                    paths,
31                    settings: settings_rx,
32                },
33            );
34        }
35    });
36}
37
38fn init_logger() {
39    let level = LevelFilter::Info;
40
41    if stdout_is_a_pty() {
42        SimpleLogger::init(level, Default::default()).expect("could not initialize logger");
43    } else {
44        let log_dir_path = dirs::home_dir()
45            .expect("could not locate home directory for logging")
46            .join("Library/Logs/");
47        let log_file_path = log_dir_path.join("Zed.log");
48        fs::create_dir_all(&log_dir_path).expect("could not create log directory");
49        let log_file = OpenOptions::new()
50            .create(true)
51            .append(true)
52            .open(log_file_path)
53            .expect("could not open logfile");
54        simplelog::WriteLogger::init(level, simplelog::Config::default(), log_file)
55            .expect("could not initialize logger");
56    }
57}
58
59fn stdout_is_a_pty() -> bool {
60    unsafe { libc::isatty(libc::STDOUT_FILENO as i32) != 0 }
61}
62
63fn collect_path_args() -> Vec<PathBuf> {
64    std::env::args()
65        .skip(1)
66        .filter_map(|arg| match fs::canonicalize(arg) {
67            Ok(path) => Some(path),
68            Err(error) => {
69                log::error!("error parsing path argument: {}", error);
70                None
71            }
72        })
73        .collect::<Vec<_>>()
74}