♻️ Use of "target_family" instead of feature to manage wasm platform

This commit is contained in:
2024-05-21 12:38:40 +02:00
parent f43f54c120
commit a1fe74f53e
4 changed files with 66 additions and 43 deletions

View File

@@ -6,6 +6,12 @@ use image::{DynamicImage, ImageFormat};
use image::{GenericImage, RgbImage};
use tracing::{error, warn};
cfg_if! {
if #[cfg(not(target_family = "wasm"))] {
use tokio::task::spawn_blocking;
}
}
fn from_raw_to_image(raw: &Vec<u8>) -> Option<DynamicImage> {
match Reader::new(Cursor::new(raw)).with_guessed_format() {
Ok(reader) => match reader.decode() {
@@ -19,7 +25,7 @@ fn from_raw_to_image(raw: &Vec<u8>) -> Option<DynamicImage> {
None
}
pub fn create_mozaik(
fn create_mozaik_(
width_px: u32,
height_px: u32,
images: &[Vec<u8>],
@@ -90,3 +96,21 @@ pub fn create_mozaik(
bytes
}
pub async fn create_mozaik(
width_px: u32,
height_px: u32,
images: Vec<Vec<u8>>,
padding_image: Option<Vec<u8>>,
) -> Vec<u8> {
cfg_if! {
if #[cfg(target_family = "wasm")] {
create_mozaik_(width_px, height_px, &images, &padding_image)
}
else {
spawn_blocking(move || {
create_mozaik_(width_px, height_px, &images, &padding_image)
}).await.unwrap()
}
}
}

View File

@@ -7,11 +7,13 @@ use rand::distributions::{Alphanumeric, DistString};
use reqwest::Result as RequestResult;
use tracing::error;
#[cfg(feature = "desktop")]
use tokio::fs::read_to_string;
#[cfg(feature = "web")]
use web_sys;
cfg_if! {
if #[cfg(target_family = "wasm")] {
use web_sys;
} else {
use tokio::fs::read_to_string;
}
}
#[derive(Eq, PartialEq, Hash)]
pub enum AvatarFeeling {
@@ -145,39 +147,38 @@ async fn fetch_dicebear_svg(
text.unwrap_or("".to_string())
}
#[cfg(feature = "desktop")]
fn gen_placeholder_fetcher(path: &'static str) -> Box<impl Future<Output = Option<String>>> {
let path = format!("./public/{}", &path);
Box::new(async move {
match read_to_string(&path).await {
Ok(content) => Some(content),
Err(err) => {
error!(
"Error during the access to the {path} file: {}",
err.to_string()
);
None
}
cfg_if! {
if #[cfg(target_family = "wasm")] {
fn gen_placeholder_fetcher<'a>(path: &'static str) -> Box<impl Future<Output = Option<String>>> {
Box::new(async move {
let url = format!("{}{}", web_sys::window().unwrap().origin(), path);
match fetch_text(url).await {
Ok(content) => Some(content),
Err(err) => {
error!("Error during {path} fetching: {}", err.to_string());
None
}
}
})
}
})
}
#[cfg(feature = "web")]
fn gen_placeholder_fetcher<'a>(path: &'static str) -> Box<impl Future<Output = Option<String>>> {
Box::new(async move {
let url = format!("{}{}", web_sys::window().unwrap().origin(), path);
match fetch_text(url).await {
Ok(content) => Some(content),
Err(err) => {
error!("Error during {path} fetching: {}", err.to_string());
None
}
}
else {
fn gen_placeholder_fetcher(path: &'static str) -> Box<impl Future<Output = Option<String>>> {
let path = format!("./public/{}", &path);
Box::new(async move {
match read_to_string(&path).await {
Ok(content) => Some(content),
Err(err) => {
error!(
"Error during the access to the {path} file: {}",
err.to_string()
);
None
}
}
})
}
})
}
#[cfg(not(any(feature = "desktop", feature = "web")))]
fn gen_placeholder_fetcher<'a>(_path: &'static str) -> Box<impl Future<Output = Option<String>>> {
Box::new(async move { None })
}
}
pub async fn generate_random_svg_avatar<'a>(config: Option<&'a AvatarConfig<'a>>) -> String {