Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2d9b214ff4 | ||
|
|
80d2e7fd71 | ||
|
|
03e1311e90 | ||
|
|
a93f3ad9f6 | ||
|
|
b0407d6519 | ||
|
|
c484f2deb8 | ||
|
|
958a729880 | ||
|
|
8c6ed94850 | ||
|
|
d4ca9e7542 |
3
Cargo.lock
generated
3
Cargo.lock
generated
@@ -189,6 +189,7 @@ dependencies = [
|
|||||||
"crossterm_winapi",
|
"crossterm_winapi",
|
||||||
"derive_more",
|
"derive_more",
|
||||||
"document-features",
|
"document-features",
|
||||||
|
"filedescriptor",
|
||||||
"mio",
|
"mio",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"rustix",
|
"rustix",
|
||||||
@@ -1203,7 +1204,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ostiary"
|
name = "ostiary"
|
||||||
version = "1.1.1"
|
version = "1.1.5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "ostiary"
|
name = "ostiary"
|
||||||
version = "1.1.1"
|
version = "1.1.5"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
crossterm = "0.29"
|
crossterm = { version = "0.29", features = ["use-dev-tty"] }
|
||||||
ratatui = "0.30"
|
ratatui = "0.30"
|
||||||
tokio = { version = "1", features = ["full"] }
|
tokio = { version = "1", features = ["full"] }
|
||||||
reqwest = { version = "0.12", features = ["json", "stream", "rustls-tls"], default-features = false }
|
reqwest = { version = "0.12", features = ["json", "stream", "rustls-tls"], default-features = false }
|
||||||
|
|||||||
@@ -108,4 +108,8 @@ fi
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
ok "Launching ${BINARY}..."
|
ok "Launching ${BINARY}..."
|
||||||
exec "$INSTALL_DIR/$BINARY"
|
if { true </dev/tty; } 2>/dev/null; then
|
||||||
|
"$INSTALL_DIR/$BINARY"
|
||||||
|
else
|
||||||
|
ok "Run: $BINARY"
|
||||||
|
fi
|
||||||
|
|||||||
50
src/main.rs
50
src/main.rs
@@ -170,44 +170,58 @@ async fn run_exec(
|
|||||||
|
|
||||||
/// Runs before ratatui starts. Prompts for endpoint URL and name on first launch.
|
/// Runs before ratatui starts. Prompts for endpoint URL and name on first launch.
|
||||||
fn prompt_first_endpoint() -> Result<(String, String)> {
|
fn prompt_first_endpoint() -> Result<(String, String)> {
|
||||||
use std::io::Write;
|
use std::io::{BufRead, BufReader, Write};
|
||||||
|
|
||||||
println!();
|
// Open /dev/tty read-only for keyboard input so the wizard works even when
|
||||||
println!(" ╔══════════════════════════════════╗");
|
// stdin is a pipe (e.g. `curl | bash`). Writing goes through stdout so we
|
||||||
println!(" ║ Ostiary — первый запуск ║");
|
// don't touch the terminal's write-side state before crossterm takes over.
|
||||||
println!(" ╚══════════════════════════════════╝");
|
let tty_in = std::fs::File::open("/dev/tty")
|
||||||
println!();
|
.map_err(|e| anyhow::anyhow!(
|
||||||
println!(" Конфиг будет сохранён в:");
|
"Не удалось открыть терминал ({e}). Запустите ostiary напрямую."
|
||||||
println!(" {}", config::config_path().display());
|
))?;
|
||||||
println!();
|
let mut reader = BufReader::new(tty_in);
|
||||||
|
let mut out = std::io::stdout();
|
||||||
|
|
||||||
|
writeln!(out)?;
|
||||||
|
writeln!(out, " ╔══════════════════════════════════╗")?;
|
||||||
|
writeln!(out, " ║ Ostiary — первый запуск ║")?;
|
||||||
|
writeln!(out, " ╚══════════════════════════════════╝")?;
|
||||||
|
writeln!(out)?;
|
||||||
|
writeln!(out, " Конфиг будет сохранён в:")?;
|
||||||
|
writeln!(out, " {}", config::config_path().display())?;
|
||||||
|
writeln!(out)?;
|
||||||
|
|
||||||
let name = loop {
|
let name = loop {
|
||||||
print!(" Название эндпоинта: ");
|
write!(out, " Название эндпоинта: ")?;
|
||||||
std::io::stdout().flush()?;
|
out.flush()?;
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
std::io::stdin().read_line(&mut buf)?;
|
if reader.read_line(&mut buf)? == 0 {
|
||||||
|
anyhow::bail!("Неожиданный конец ввода.");
|
||||||
|
}
|
||||||
let val = buf.trim().to_string();
|
let val = buf.trim().to_string();
|
||||||
if val.is_empty() {
|
if val.is_empty() {
|
||||||
println!(" Название не может быть пустым. Попробуйте ещё раз.\n");
|
writeln!(out, " Название не может быть пустым. Попробуйте ещё раз.\n")?;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break val;
|
break val;
|
||||||
};
|
};
|
||||||
|
|
||||||
let url = loop {
|
let url = loop {
|
||||||
print!(" URL эндпоинта: ");
|
write!(out, " URL эндпоинта: ")?;
|
||||||
std::io::stdout().flush()?;
|
out.flush()?;
|
||||||
let mut buf = String::new();
|
let mut buf = String::new();
|
||||||
std::io::stdin().read_line(&mut buf)?;
|
if reader.read_line(&mut buf)? == 0 {
|
||||||
|
anyhow::bail!("Неожиданный конец ввода.");
|
||||||
|
}
|
||||||
let val = buf.trim().to_string();
|
let val = buf.trim().to_string();
|
||||||
if val.is_empty() {
|
if val.is_empty() {
|
||||||
println!(" URL не может быть пустым. Попробуйте ещё раз.\n");
|
writeln!(out, " URL не может быть пустым. Попробуйте ещё раз.\n")?;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break val;
|
break val;
|
||||||
};
|
};
|
||||||
|
|
||||||
println!();
|
writeln!(out)?;
|
||||||
Ok((url, name))
|
Ok((url, name))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user