fbxcel_dom/v7400/data/
material.rs

1//! Material data.
2
3use std::convert::{TryFrom, TryInto};
4
5use anyhow::{bail, Error};
6
7use crate::v7400::object::property::{loaders::BorrowedStringLoader, LoadProperty, PropertyHandle};
8
9/// Shading model.
10#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
11pub enum ShadingModel {
12    /// Unknown.
13    Unknown,
14    /// Lambert.
15    Lambert,
16    /// Phong.
17    Phong,
18}
19
20impl TryFrom<&str> for ShadingModel {
21    type Error = Error;
22
23    fn try_from(s: &str) -> Result<Self, Self::Error> {
24        match s {
25            "Unknown" => Ok(ShadingModel::Unknown),
26            "Lambert" => Ok(ShadingModel::Lambert),
27            "Phong" => Ok(ShadingModel::Phong),
28            s => bail!("Unexpected `ShadingModel` value: {:?}", s),
29        }
30    }
31}
32
33impl std::str::FromStr for ShadingModel {
34    type Err = Error;
35
36    fn from_str(s: &str) -> Result<Self, Self::Err> {
37        s.try_into()
38    }
39}
40
41/// `ShadingModel` property loader.
42#[derive(Default, Debug, Clone, Copy)]
43pub(crate) struct ShadingModelLoader;
44
45impl<'a> LoadProperty<'a> for ShadingModelLoader {
46    type Value = ShadingModel;
47    type Error = Error;
48
49    fn expecting(&self) -> String {
50        "string value as shading model".into()
51    }
52
53    fn load(self, node: &PropertyHandle<'a>) -> Result<Self::Value, Self::Error> {
54        node.load_value(BorrowedStringLoader::new())
55            .and_then(str::parse)
56    }
57}