aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
blob: f31ca724faa1554a9c07574e0ab2b39fdad8323b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// This file is part of Sydney <https://github.com/gemrest/sydney>.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
// Copyright (C) 2022-2022 Fuwn <[email protected]>
// SPDX-License-Identifier: GPL-3.0-only

#![deny(
  warnings,
  nonstandard_style,
  unused,
  future_incompatible,
  rust_2018_idioms,
  unsafe_code,
  clippy::all,
  clippy::nursery,
  clippy::pedantic
)]
#![recursion_limit = "128"]

mod app;
mod command;
mod input;
mod stateful_list;
mod ui;
mod url;

use ::url::Url;
use app::App;
use crossterm::{event, execute, terminal};

fn main() -> Result<(), Box<dyn std::error::Error>> {
  let mut args = std::env::args();
  let mut app = App::new();

  if let Some(arg) = args.nth(1) {
    match arg.as_str() {
      "--version" | "-v" => {
        println!("{}", env!("CARGO_PKG_VERSION"));

        return Ok(());
      }
      "--help" | "-h" => {
        println!(
          r#"usage: {} [option, capsule_uri]
Options:
    --version, -v    show version text
    --help, -h       show help text

Sample invocations:
    {0} gemini://fuwn.me/
    {0} fuwn.me
    {0} --help

Report bugs to https://github.com/gemrest/sydney/issues"#,
          args
            .next()
            .unwrap_or_else(|| env!("CARGO_PKG_NAME").to_string())
        );

        return Ok(());
      }
      _ => {
        app.url = Url::parse(&url::prefix_gemini(&arg))?;

        app.make_request();
      }
    }
  }

  terminal::enable_raw_mode()?;

  let mut stdout = std::io::stdout();

  match germ::request::request(
    &Url::parse("gemini://fuwn.me/api/sydney/version").unwrap(),
  ) {
    Ok(response) =>
      if let Some(content) = response.content() {
        let content = content.trim();

        if content > &String::from(env!("CARGO_PKG_VERSION")) {
          app.error = Some(format!(
            "Your Sydney version ({}) is outdated. It is recommended that you \
             update to the newest version ({}).",
            env!("CARGO_PKG_VERSION"),
            content,
          ));
        }
      } else {
        app.error = Some(
          "Could not check if Sydney has a newer version because the response \
           had no content. Please try again later."
            .to_string(),
        );
      },
    Err(error) =>
      app.error = Some(format!(
        "Could not check if Sydney has a newer version: {}",
        error
      )),
  }

  execute!(
    stdout,
    terminal::EnterAlternateScreen,
    event::EnableMouseCapture
  )?;

  let mut terminal =
    ratatui::Terminal::new(ratatui::backend::CrosstermBackend::new(stdout))?;
  let result =
    App::run(&mut terminal, app, std::time::Duration::from_millis(250));

  terminal::disable_raw_mode()?;
  execute!(
    terminal.backend_mut(),
    terminal::LeaveAlternateScreen,
    event::DisableMouseCapture
  )?;
  terminal.show_cursor()?;

  if let Err(err) = result {
    println!("{:?}", err);
  }

  Ok(())
}