rustploy-gui 0.1.21

Rustploy — desktop client (glacier-ui) for the Rustploy PaaS daemon
[package]
name = "rustploy-gui"
version = "0.1.21"
edition = "2024"
default-run = "rustploy-gui"
description = "Rustploy — desktop client (glacier-ui) for the Rustploy PaaS daemon"
license = "MIT"
authors = ["Antonio Fernando <antoniofernando2723@gmail.com>"]
repository = "https://github.com/antoniofernandodj/rustploy-gui"
keywords = ["paas", "deploy", "gui", "iced"]
categories = ["gui"]

[[bin]]
name = "rustploy-gui"
path = "src/main.rs"

[dependencies]
# Declarative UI engine (published; XML templates + async bridge + widgets).
# 0.36 traz o runner multi-janela (iced::daemon): a casca em `src/app/` é um
# runtime `iced::daemon` próprio, um `GlacierUI` por janela — ver `app/mod.rs`.
# feature `tray` (0.47+): ícone de bandeja + app que sobrevive à última janela.
# 0.48+: fechar a principal recolhe o motor headless (SSE + login vivos → as
# notificações de deploy chegam com a janela fechada). Ver app/mod.rs e
# docs/plano-tray-bandeja-e-ciclo-de-vida.md.
# 0.57.5+ é REQUISITO, não preferência: até a 0.57.4 a thread da bandeja deixava
# o processo no locale do usuário depois do `gtk::init()`, e num locale de
# vírgula decimal (pt_BR…) o lexer do Luau rejeitava todo literal decimal com
# "Malformed number" — `require("format")` falhava e a janela de logs não abria.
# 0.92+ traz `<drawer>`, `<tableview>`/`<tableheader>` e `<autocomplete>`; 0.94,
# `<wizard>`; 0.102, a validação declarada no `<form>` (`rules=`/`msg=`/
# `on_validation_error`/`:invalid`). 0.103: `render_current` embrulha a tela
# num `Stack` fixo — abrir menu/diálogo/toast deixa de zerar a rolagem/foco de
# um `<scrollable>` (era o pulo pro topo no clique-direito num input).
# Ver docs/plano-reforma-gui-glacier-0.102.md.
glacier-ui = { version = "0.138.0", features = ["tray"] }

# GUI — features must stay compatible with glacier-ui's iced.
iced = { version = "0.14", features = ["image", "svg", "tokio"] }

# Async / networking (runs on iced's tokio executor)
tokio = { version = "1", features = ["net", "sync", "macros", "io-util", "rt", "time"] }
rustls = { version = "0.23", features = ["ring"] }
tokio-rustls = "0.26"

# Serialization
serde = { version = "1", features = ["derive"] }
serde_json = "1"

# Errors / Time
anyhow = "1"
chrono = { version = "0.4", features = ["serde"] }

[build-dependencies]
# Helpers de build.rs (logos reduzidos, .desktop no cargo install, recursos do .exe).
glacier-build = "0.1"

# ── Debian package (cargo deb -p rustploy-gui) ───────────────────────────────────
# Installs the binary to /usr/bin, all runtime assets under /usr/share/rustploy
# preserving the `views/`/`assets/` prefixes the templates reference (the app chdir's here
# at startup — see glacier_ui::locate_assets_and_chdir), plus the .desktop entry and hicolor icons so
# the app shows up in the applications menu and the dock/taskbar.
[package.metadata.deb]
name                 = "rustploy-gui"
maintainer           = "Antonio Fernando <antoniofernando2723@gmail.com>"
copyright            = "2026, Antonio Fernando"
extended-description = "Rustploy — desktop client (glacier-ui) for the Rustploy PaaS daemon"
section              = "admin"
priority             = "optional"
# `$auto` = libs detectadas do binário (libc, etc.). O ícone de bandeja usa
# libappindicator+GTK em runtime (ver src/tray.rs na glacier), então garantimos
# as libs de sistema para o tray subir no desktop do usuário.
depends              = "$auto, libgtk-3-0, libayatana-appindicator3-1"
maintainer-scripts   = "packaging"
assets = [
    ["target/release/rustploy-gui", "usr/bin/rustploy-gui", "755"],

    # Os assets de runtime (views/estilos/scripts/ícones/logos) são EMBUTIDOS no
    # binário de release (ver src/embedded.rs), então não são mais copiados para
    # /usr/share — o executável é standalone. Só a integração com o desktop fica.

    # Desktop integration.
    ["packaging/rustploy-gui.desktop", "usr/share/applications/", "644"],
    ["packaging/icons/hicolor/**/*",         "usr/share/icons/hicolor/", "644"],
]

# Perfil de release. NÃO use `panic = "abort"`: o `mlua` EXIGE `panic = "unwind"`
# (o Luau é C++ e propaga erro de Lua desenrolando a pilha por frames Rust do
# mlua; com `abort` qualquer erro de Lua num callback vira SIGABRT).
[profile.release]
opt-level = 3
lto = true
codegen-units = 1

[profile.dev.package."*"]
opt-level = 2

# Recorte do text_editor no renderer de software (ver vendor/README.md).
[patch.crates-io]
iced_tiny_skia = { path = "vendor/iced_tiny_skia" }