mod api;
mod app;
mod auth;
mod config;
mod debug_log;
mod emoji;
mod event_loop;
#[macro_use]
mod logging;
#[macro_use]
mod reply_debug_log;
mod session;
mod terminal;
mod text_wrapper;
mod ui;
use anyhow::Result;
use app::App;
use clap::Parser;
#[derive(Parser)]
#[command(name = "fido")]
#[command(about = "A terminal-based social network for developers")]
#[command(version)]
struct Cli {
#[arg(long, short, env = "FIDO_SERVER_URL")]
server: Option<String>,
#[arg(long, short)]
verbose: bool,
}
fn load_env() {
let _ = dotenv::dotenv();
}
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
load_env();
let log_config = if cli.verbose {
logging::LogConfig::verbose()
} else {
logging::LogConfig::disabled()
};
logging::init_logging(&log_config)?;
let mut tui = terminal::init()?;
let is_demo_mode = std::env::var("FIDO_DEMO_MODE").is_ok();
let mut app = if is_demo_mode {
log::info!("Starting in DEMO MODE with MockBackend");
App::demo()
} else if let Some(server_url) = cli.server {
App::with_server_url(server_url)
} else {
App::new()
};
app.log_config = log_config;
let is_web_mode = std::env::var("FIDO_WEB_MODE").is_ok();
if is_web_mode || is_demo_mode {
app.auth_state.show_github_option = false;
}
let mut auth_flow = auth::AuthFlow::new(app.api_client.clone())?;
if !is_web_mode && !is_demo_mode {
if let Ok(Some(user)) = auth_flow.check_existing_session().await {
log::info!("Restored session for user: {}", user.username);
app.auth_state.current_user = Some(user);
app.current_screen = app::Screen::Main;
app.api_client = auth_flow.api_client().clone();
let _ = app.load_settings().await;
app.load_filter_preference();
let _ = app.load_posts().await;
} else {
log::info!("No valid session found, showing authentication screen");
let _ = app.load_test_users().await;
}
} else {
if is_demo_mode {
log::info!("Running in demo mode, loading test users only");
} else {
log::info!("Running in web mode, loading test users only");
}
let _ = app.load_test_users().await;
}
let mut event_loop = event_loop::EventLoop::new();
event_loop.run(&mut app, &mut auth_flow, &mut tui).await?;
terminal::restore()?;
Ok(())
}