fbxcel_dom/v7400/data/
material.rs1use std::convert::{TryFrom, TryInto};
4
5use anyhow::{bail, Error};
6
7use crate::v7400::object::property::{loaders::BorrowedStringLoader, LoadProperty, PropertyHandle};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
11pub enum ShadingModel {
12 Unknown,
14 Lambert,
16 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#[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}