From 5882bdd8f7b585e90ccbae46a014b8b8628b9324 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Thu, 31 Oct 2024 19:56:08 -0400 Subject: [PATCH] Bubble up errors to JS --- index.html | 4 ++++ src/downloader.rs | 7 +++---- src/html.rs | 2 -- src/lib.rs | 23 ++++++++++++++++++----- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/index.html b/index.html index 6e14ac2..5c98806 100644 --- a/index.html +++ b/index.html @@ -13,6 +13,9 @@ archive_character_base64(document.getElementById("name").value, false).then((uri) => { // Download character archive window.location.replace(uri); + document.getElementById("statusMessage").innerText = "Archive complete!"; + }).catch((err) => { + document.getElementById("statusMessage").innerText = err; }); }); } @@ -54,5 +57,6 @@ Source Code +

diff --git a/src/downloader.rs b/src/downloader.rs index eb82f64..ee499d0 100644 --- a/src/downloader.rs +++ b/src/downloader.rs @@ -1,13 +1,12 @@ use reqwest::Url; -pub async fn download(url: &Url) -> Result, ()> { +pub async fn download(url: &Url) -> Result, reqwest::Error> { let client = reqwest::Client::builder() - .build() - .unwrap(); + .build()?; let body = client.get(url.to_string()) .send() .await; - Ok(body.unwrap().bytes().await.unwrap().to_vec()) + Ok(body?.bytes().await?.to_vec()) } diff --git a/src/html.rs b/src/html.rs index d456800..1aaecdc 100644 --- a/src/html.rs +++ b/src/html.rs @@ -1,7 +1,5 @@ use crate::data::CharacterData; use minijinja::{context, Environment}; -use std::fs::write; -use std::io; /// Writes a visual HTML for `char_data` to `file_path`. /// This vaguely represents Lodestone and designed to visually check your character data. diff --git a/src/lib.rs b/src/lib.rs index a5abc22..182e022 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,6 +20,8 @@ use crate::parser::parse_search; use base64::prelude::*; #[cfg(target_family = "wasm")] use wasm_bindgen::prelude::wasm_bindgen; +#[cfg(target_family = "wasm")] +use wasm_bindgen::JsValue; const LODESTONE_HOST: &str = "https://na.finalfantasyxiv.com"; @@ -83,6 +85,19 @@ impl From for ArchiveError { } } +#[cfg(target_family = "wasm")] +impl From for JsValue { + fn from(err: ArchiveError) -> Self { + match err { + // TODO: give JS the URL that failed to download + ArchiveError::DownloadFailed(_) => { JsValue::from_str(&"download_failed".to_string()) } + ArchiveError::CharacterNotFound => { JsValue::from_str(&"character_not_found".to_string()) } + ArchiveError::ParsingError => { JsValue::from_str(&"parsing_error".to_string())} + ArchiveError::UnknownError => { JsValue::from_str(&"unknown_error".to_string()) } + } + } +} + /// Archives the character named `character_name` and gives a ZIP file as bytes that can be written to disk. pub async fn archive_character(character_name: &str, use_dalamud: bool) -> Result, ArchiveError> { let search_url = Url::parse_with_params(&format!("{LODESTONE_HOST}/lodestone/character?"), &[("q", character_name)]).map_err(|_| ArchiveError::UnknownError)?; @@ -170,9 +185,7 @@ pub async fn archive_character(character_name: &str, use_dalamud: bool) -> Resul /// Archives the character named `character_name` and converts the ZIP file to Base64. Useful for downloading via data URIs. #[cfg(target_family = "wasm")] #[wasm_bindgen] -pub async extern fn archive_character_base64(character_name: &str, use_dalamud: bool) -> String { - let buf = archive_character(character_name, use_dalamud).await; - - let base64 = BASE64_STANDARD.encode(buf); - return format!("data:application/octet-stream;charset=utf-16le;base64,{base64}").into(); +pub async extern fn archive_character_base64(character_name: &str, use_dalamud: bool) -> Result { + let buf: String = archive_character(character_name, use_dalamud).await.map(|x| BASE64_STANDARD.encode(x))?; + return Ok(format!("data:application/octet-stream;charset=utf-16le;base64,{buf}").into()); } \ No newline at end of file