use crate::{
asset::{io::ResourceIo, Resource, ResourceData},
core::{
io::FileError, math::curve::Curve, reflect::prelude::*, uuid::Uuid, visitor::prelude::*,
TypeUuidProvider,
},
};
use std::error::Error;
use std::{
fmt::{Display, Formatter},
path::Path,
};
use uuid::uuid;
pub mod loader;
#[derive(Debug)]
pub enum CurveResourceError {
Io(FileError),
Visit(VisitError),
}
impl Display for CurveResourceError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
CurveResourceError::Io(v) => {
write!(f, "A file load error has occurred {v:?}")
}
CurveResourceError::Visit(v) => {
write!(
f,
"An error that may occur due to version incompatibilities. {v:?}"
)
}
}
}
}
impl From<FileError> for CurveResourceError {
fn from(e: FileError) -> Self {
Self::Io(e)
}
}
impl From<VisitError> for CurveResourceError {
fn from(e: VisitError) -> Self {
Self::Visit(e)
}
}
#[derive(Debug, Clone, Visit, Default, Reflect)]
pub struct CurveResourceState {
pub curve: Curve,
}
impl ResourceData for CurveResourceState {
fn type_uuid(&self) -> Uuid {
<Self as TypeUuidProvider>::type_uuid()
}
fn save(&mut self, _path: &Path) -> Result<(), Box<dyn Error>> {
Err("Saving is not supported!".to_string().into())
}
fn can_be_saved(&self) -> bool {
false
}
fn try_clone_box(&self) -> Option<Box<dyn ResourceData>> {
Some(Box::new(self.clone()))
}
}
impl TypeUuidProvider for CurveResourceState {
fn type_uuid() -> Uuid {
uuid!("f28b949f-28a2-4b68-9089-59c234f58b6b")
}
}
impl CurveResourceState {
pub async fn from_file(path: &Path, io: &dyn ResourceIo) -> Result<Self, CurveResourceError> {
let bytes = io.load_file(path).await?;
let mut visitor = Visitor::load_from_memory(&bytes)?;
let mut curve = Curve::default();
curve.visit("Curve", &mut visitor)?;
Ok(Self { curve })
}
}
pub type CurveResource = Resource<CurveResourceState>;