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}