use crate::{
asset::{define_new_resource, Resource, ResourceData},
core::{curve::Curve, io::FileLoadError, visitor::prelude::*},
};
use std::{
borrow::Cow,
path::{Path, PathBuf},
};
#[derive(Debug, thiserror::Error)]
pub enum CurveResourceError {
#[error("A file load error has occurred {0:?}")]
Io(FileLoadError),
#[error("An error that may occur due to version incompatibilities. {0:?}")]
Visit(VisitError),
}
impl From<FileLoadError> for CurveResourceError {
fn from(e: FileLoadError) -> Self {
Self::Io(e)
}
}
impl From<VisitError> for CurveResourceError {
fn from(e: VisitError) -> Self {
Self::Visit(e)
}
}
#[derive(Debug, Visit, Default)]
pub struct CurveResourceState {
pub(in crate) path: PathBuf,
pub curve: Curve,
}
impl ResourceData for CurveResourceState {
fn path(&self) -> Cow<Path> {
Cow::Borrowed(&self.path)
}
fn set_path(&mut self, path: PathBuf) {
self.path = path;
}
}
impl CurveResourceState {
pub async fn from_file(path: &Path) -> Result<Self, CurveResourceError> {
let mut visitor = Visitor::load_binary(path).await?;
let mut curve = Curve::default();
curve.visit("Curve", &mut visitor)?;
Ok(Self {
curve,
path: path.to_path_buf(),
})
}
}
define_new_resource!(
CurveResource<CurveResourceState, CurveResourceError>
);