# Objective So while using gpui I didn't know that you needed to register a http_client if you wanted to use images with a link as a source. So I enabled logs, and I did get errors. ``` 20:48:11 [ERROR] Failed to load asset2: error: loading image asset from "https://im.fumo.ing/tLNyIY4n7PEG.jpg" ``` But they didn't tell me what was wrong. ## Solution I change 2 lines to print the whole error with all the context. ``` 20:49:09 [ERROR] Failed to load asset2: Other(loading image asset from "https://im.fumo.ing/tLNyIY4n7PEG.jpg" Caused by: No HttpClient available) ``` And now it does tell you why it doesn't work. ✨Amazing✨. ## Testing Because I did change the traits needed for the AssetLogger I build zed to check if it didn't break anything. And it build, so it fine I think. A quick way to test the change in logging is the gpui example `image_gallery.rs` and commenting the lines 259 & 260 ```rust #[cfg(not(target_family = "wasm"))] { let http_client = ReqwestClient::user_agent("gpui example").unwrap(); cx.set_http_client(Arc::new(http_client)); } ``` Or change the URI on line 42 to something non existing. ## Self-Review Checklist: - [X] I've reviewed my own diff for quality, security, and reliability - [X] Unsafe blocks (if any) have justifying comments - [X] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [X] Tests cover the new/changed behavior - [X] Performance impact has been considered and is acceptable Release Notes: - Improved Error logging for Asset loading
83 lines
2.0 KiB
Rust
83 lines
2.0 KiB
Rust
use crate::{App, SharedString, SharedUri};
|
|
use futures::{Future, TryFutureExt};
|
|
|
|
use std::fmt::Debug;
|
|
use std::hash::{BuildHasher, Hash};
|
|
use std::marker::PhantomData;
|
|
use std::path::{Path, PathBuf};
|
|
use std::sync::Arc;
|
|
|
|
/// An enum representing
|
|
#[derive(Debug, PartialEq, Eq, Hash, Clone)]
|
|
pub enum Resource {
|
|
/// This resource is at a given URI
|
|
Uri(SharedUri),
|
|
/// This resource is at a given path in the file system
|
|
Path(Arc<Path>),
|
|
/// This resource is embedded in the application binary
|
|
Embedded(SharedString),
|
|
}
|
|
|
|
impl From<SharedUri> for Resource {
|
|
fn from(value: SharedUri) -> Self {
|
|
Self::Uri(value)
|
|
}
|
|
}
|
|
|
|
impl From<PathBuf> for Resource {
|
|
fn from(value: PathBuf) -> Self {
|
|
Self::Path(value.into())
|
|
}
|
|
}
|
|
|
|
impl From<Arc<Path>> for Resource {
|
|
fn from(value: Arc<Path>) -> Self {
|
|
Self::Path(value)
|
|
}
|
|
}
|
|
|
|
/// A trait for asynchronous asset loading.
|
|
pub trait Asset: 'static {
|
|
/// The source of the asset.
|
|
type Source: Clone + Hash + Send;
|
|
|
|
/// The loaded asset
|
|
type Output: Clone + Send;
|
|
|
|
/// Load the asset asynchronously
|
|
fn load(
|
|
source: Self::Source,
|
|
cx: &mut App,
|
|
) -> impl Future<Output = Self::Output> + Send + 'static;
|
|
}
|
|
|
|
/// An asset Loader which logs the [`Err`] variant of a [`Result`] during loading
|
|
pub enum AssetLogger<T> {
|
|
#[doc(hidden)]
|
|
_Phantom(PhantomData<T>, &'static dyn crate::seal::Sealed),
|
|
}
|
|
|
|
impl<T, R, E> Asset for AssetLogger<T>
|
|
where
|
|
T: Asset<Output = Result<R, E>>,
|
|
R: Clone + Send,
|
|
E: Clone + Send + Debug,
|
|
{
|
|
type Source = T::Source;
|
|
|
|
type Output = T::Output;
|
|
|
|
fn load(
|
|
source: Self::Source,
|
|
cx: &mut App,
|
|
) -> impl Future<Output = Self::Output> + Send + 'static {
|
|
let load = T::load(source, cx);
|
|
load.inspect_err(|e| log::error!("Failed to load asset: {:?}", e))
|
|
}
|
|
}
|
|
|
|
/// Use a quick, non-cryptographically secure hash function to get an identifier from data
|
|
pub fn hash<T: Hash>(data: &T) -> u64 {
|
|
collections::FxBuildHasher.hash_one(data)
|
|
}
|