From b9baee7e5fbf91eb6884f69a180dd88ab8e36f3b Mon Sep 17 00:00:00 2001 From: Nova Date: Mon, 5 Dec 2022 22:44:04 -0500 Subject: [PATCH] feat(resources): list of extensions to check --- src/core/resource.rs | 39 ++++++++++++++++++++++++------------- src/nodes/drawable/model.rs | 2 ++ src/nodes/drawable/text.rs | 10 +++++++--- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/core/resource.rs b/src/core/resource.rs index 812959a..823286b 100644 --- a/src/core/resource.rs +++ b/src/core/resource.rs @@ -1,29 +1,42 @@ use color_eyre::eyre::eyre; use serde::{de::Visitor, Deserialize}; -use std::path::PathBuf; +use std::{ffi::OsStr, path::PathBuf}; pub enum ResourceID { File(PathBuf), Namespaced { namespace: String, path: PathBuf }, } impl ResourceID { - pub fn get_file(&self, prefixes: &[PathBuf]) -> Option { + pub fn get_file(&self, prefixes: &[PathBuf], extensions: &[&OsStr]) -> Option { match self { - ResourceID::File(file) => (file.is_absolute() && file.exists()).then_some(file.clone()), + ResourceID::File(file) => (file.is_absolute() + && file.exists() && Self::has_extension(file, extensions)) + .then_some(file.clone()), ResourceID::Namespaced { namespace, path } => { - for prefix in prefixes { - let mut test_path = prefix.clone(); - test_path.push(namespace.clone()); - test_path.push(path.clone()); - - if test_path.as_path().exists() { - return Some(test_path); - } - } - None + let file_name = path.file_name()?; + prefixes + .iter() + .filter_map(|prefix| { + let prefixed_path = prefix.clone().join(namespace).join(path); + let parent = prefixed_path.parent()?; + std::fs::read_dir(parent).ok() + }) + .flatten() + .filter_map(|item| item.ok()) + .map(|dir_entry| dir_entry.path()) + .filter(|path| path.file_stem() == Some(file_name)) + .find(|path| Self::has_extension(path, extensions)) } } } + + fn has_extension(path: &PathBuf, extensions: &[&OsStr]) -> bool { + if let Some(path_extension) = path.extension() { + extensions.contains(&path_extension) + } else { + false + } + } } impl<'de> Deserialize<'de> for ResourceID { fn deserialize(deserializer: D) -> Result diff --git a/src/nodes/drawable/model.rs b/src/nodes/drawable/model.rs index a46b6f5..0ddd9a0 100644 --- a/src/nodes/drawable/model.rs +++ b/src/nodes/drawable/model.rs @@ -13,6 +13,7 @@ use send_wrapper::SendWrapper; use serde::Deserialize; use stardust_xr::schemas::flex::deserialize; use stardust_xr::values::Transform; +use std::ffi::OsStr; use std::fmt::Error; use std::path::PathBuf; use std::sync::Arc; @@ -70,6 +71,7 @@ impl Model { .base_resource_prefixes .lock() .clone(), + &[OsStr::new("glb"), OsStr::new("gltf")], ) .ok_or_else(|| eyre!("Resource not found"))?, ); diff --git a/src/nodes/drawable/text.rs b/src/nodes/drawable/text.rs index 00e0e6c..10aa15c 100644 --- a/src/nodes/drawable/text.rs +++ b/src/nodes/drawable/text.rs @@ -14,7 +14,7 @@ use prisma::{Flatten, Rgb, Rgba}; use send_wrapper::SendWrapper; use serde::Deserialize; use stardust_xr::{schemas::flex::deserialize, values::Transform}; -use std::{path::PathBuf, sync::Arc}; +use std::{ffi::OsStr, path::PathBuf, sync::Arc}; use stereokit::{ font::Font, lifecycle::DrawContext, @@ -66,8 +66,12 @@ impl Text { let client = node.get_client().ok_or_else(|| eyre!("Client not found"))?; let text = TEXT_REGISTRY.add(Text { space: node.spatial.get().unwrap().clone(), - font_path: font_resource_id - .and_then(|res| res.get_file(&client.base_resource_prefixes.lock().clone())), + font_path: font_resource_id.and_then(|res| { + res.get_file( + &client.base_resource_prefixes.lock().clone(), + &[OsStr::new("ttf"), OsStr::new("otf")], + ) + }), style: OnceCell::new(), data: Mutex::new(TextData {