1
Fork 0
mirror of https://github.com/redstrate/Auracite.git synced 2025-04-27 22:57:45 +00:00

Bubble up errors to the Qt UI

This commit is contained in:
Joshua Goins 2024-10-31 20:18:29 -04:00
parent 5882bdd8f7
commit 56f3436a4c
3 changed files with 45 additions and 8 deletions

View file

@ -1,3 +1,4 @@
import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Controls as QQC2 import QtQuick.Controls as QQC2
import org.kde.kirigami as Kirigami import org.kde.kirigami as Kirigami
@ -22,4 +23,16 @@ Kirigami.ApplicationWindow {
onClicked: root.backend.archiveCharacter(characterNameField.text, false) onClicked: root.backend.archiveCharacter(characterNameField.text, false)
} }
} }
Connections {
target: backend
function onArchiveSuccessful(): void {
console.info("Archive done!");
}
function onArchiveFailed(message: string): void {
console.error("Failed: " + message);
}
}
} }

View file

@ -9,24 +9,46 @@ pub mod bridge {
#[qobject] #[qobject]
#[qml_element] #[qml_element]
type Backend = super::BackendRust; type Backend = super::BackendRust;
#[qsignal]
#[cxx_name = "archiveSuccessful"]
fn archive_successful(self: Pin<&mut Backend>);
#[qsignal]
#[cxx_name = "archiveFailed"]
fn archive_failed(self: Pin<&mut Backend>, message: &QString);
} }
unsafe extern "RustQt" { unsafe extern "RustQt" {
#[qinvokable] #[qinvokable]
#[cxx_name = "archiveCharacter"] #[cxx_name = "archiveCharacter"]
fn archive_character(self: &Backend, character_name: &QString, use_dalamud: bool); fn archive_character(self: Pin<&mut Backend>, character_name: &QString, use_dalamud: bool);
} }
} }
use std::pin::Pin;
use cxx_kde_frameworks::ki18n::i18n;
use crate::archive_character_blocking; use crate::archive_character_blocking;
use cxx_qt_lib::QString; use cxx_qt_lib::QString;
use auracite::ArchiveError;
#[derive(Default)] #[derive(Default)]
pub struct BackendRust { pub struct BackendRust {
} }
impl bridge::Backend { impl bridge::Backend {
pub fn archive_character(&self, character_name: &QString, use_dalamud: bool) { pub fn archive_character(mut self: Pin<&mut Self>, character_name: &QString, use_dalamud: bool) {
archive_character_blocking(&character_name.to_string(), use_dalamud); match archive_character_blocking(&character_name.to_string(), use_dalamud) {
Ok(_) => { self.archive_successful() }
Err(err) => {
match err {
// TODO: Pass the URL up
ArchiveError::DownloadFailed(_) => { self.archive_failed(&i18n("Download failed")) }
ArchiveError::CharacterNotFound => { self.archive_failed(&i18n("Character not found")) }
ArchiveError::ParsingError => { self.archive_failed(&i18n("Parsing error")) }
ArchiveError::UnknownError => { self.archive_failed(&i18n("Unknown error")) }
}
}
}
} }
} }

View file

@ -4,18 +4,20 @@ use cxx_kde_frameworks::kcoreaddons::{KAboutData, License};
use cxx_kde_frameworks::ki18n::{i18n, i18nc, KLocalizedContext, KLocalizedString}; use cxx_kde_frameworks::ki18n::{i18n, i18nc, KLocalizedContext, KLocalizedString};
use cxx_qt_lib::{QByteArray, QGuiApplication, QList, QQmlApplicationEngine, QQuickStyle, QString, QStringList, QUrl}; use cxx_qt_lib::{QByteArray, QGuiApplication, QList, QQmlApplicationEngine, QQuickStyle, QString, QStringList, QUrl};
use cxx_qt_lib_extras::{QCommandLineOption, QCommandLineParser}; use cxx_qt_lib_extras::{QCommandLineOption, QCommandLineParser};
use auracite::archive_character; use auracite::{archive_character, ArchiveError};
pub mod bridge; pub mod bridge;
fn archive_character_blocking(character_name: &String, use_dalamud: bool) { fn archive_character_blocking(character_name: &String, use_dalamud: bool) -> Result<(), ArchiveError> {
let rt = tokio::runtime::Builder::new_current_thread() let rt = tokio::runtime::Builder::new_current_thread()
.enable_all() .enable_all()
.build() .build()
.unwrap(); .map_err(|_| ArchiveError::UnknownError)?;
let inner = rt.block_on(archive_character(&character_name.to_string(), use_dalamud)).unwrap(); let inner = rt.block_on(archive_character(&character_name.to_string(), use_dalamud))?;
write("/home/josh/test.zip", inner); write("/home/josh/test.zip", inner)?;
Ok(())
} }
fn main() { fn main() {