rg3d/resource/fbx/document/
attribute.rs

1use std::fmt::Formatter;
2
3pub enum FbxAttribute {
4    Double(f64),
5    Float(f32),
6    Integer(i32),
7    Long(i64),
8    Bool(bool),
9    String(String), // ASCII Fbx always have every attribute in string form
10}
11
12impl std::fmt::Display for FbxAttribute {
13    fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> {
14        match self {
15            FbxAttribute::Double(double) => write!(f, "{}", double),
16            FbxAttribute::Float(float) => write!(f, "{}", float),
17            FbxAttribute::Integer(integer) => write!(f, "{}", integer),
18            FbxAttribute::Long(long) => write!(f, "{}", long),
19            FbxAttribute::Bool(boolean) => write!(f, "{}", boolean),
20            FbxAttribute::String(string) => write!(f, "{}", string),
21        }
22    }
23}
24
25impl FbxAttribute {
26    pub fn as_i32(&self) -> Result<i32, String> {
27        match self {
28            FbxAttribute::Double(val) => Ok(*val as i32),
29            FbxAttribute::Float(val) => Ok(*val as i32),
30            FbxAttribute::Integer(val) => Ok(*val),
31            FbxAttribute::Long(val) => Ok(*val as i32),
32            FbxAttribute::Bool(val) => Ok(*val as i32),
33            FbxAttribute::String(val) => match val.parse::<i32>() {
34                Ok(i) => Ok(i),
35                Err(_) => Err(format!("Unable to convert string {} to i32", val)),
36            },
37        }
38    }
39
40    pub fn as_i64(&self) -> Result<i64, String> {
41        match self {
42            FbxAttribute::Double(val) => Ok(*val as i64),
43            FbxAttribute::Float(val) => Ok(*val as i64),
44            FbxAttribute::Integer(val) => Ok(i64::from(*val)),
45            FbxAttribute::Long(val) => Ok(*val as i64),
46            FbxAttribute::Bool(val) => Ok(*val as i64),
47            FbxAttribute::String(val) => match val.parse::<i64>() {
48                Ok(i) => Ok(i),
49                Err(_) => Err(format!("Unable to convert string {} to i64", val)),
50            },
51        }
52    }
53
54    pub fn as_f64(&self) -> Result<f64, String> {
55        match self {
56            FbxAttribute::Double(val) => Ok(*val),
57            FbxAttribute::Float(val) => Ok(f64::from(*val)),
58            FbxAttribute::Integer(val) => Ok(f64::from(*val)),
59            FbxAttribute::Long(val) => Ok(*val as f64),
60            FbxAttribute::Bool(val) => Ok((*val as i64) as f64),
61            FbxAttribute::String(val) => match val.parse::<f64>() {
62                Ok(i) => Ok(i),
63                Err(_) => Err(format!("Unable to convert string {} to f64", val)),
64            },
65        }
66    }
67
68    pub fn as_f32(&self) -> Result<f32, String> {
69        match self {
70            FbxAttribute::Double(val) => Ok(*val as f32),
71            FbxAttribute::Float(val) => Ok(*val),
72            FbxAttribute::Integer(val) => Ok(*val as f32),
73            FbxAttribute::Long(val) => Ok(*val as f32),
74            FbxAttribute::Bool(val) => Ok((*val as i32) as f32),
75            FbxAttribute::String(val) => match val.parse::<f32>() {
76                Ok(i) => Ok(i),
77                Err(_) => Err(format!("Unable to convert string {} to f32", val)),
78            },
79        }
80    }
81
82    pub fn as_string(&self) -> String {
83        match self {
84            FbxAttribute::Double(val) => val.to_string(),
85            FbxAttribute::Float(val) => val.to_string(),
86            FbxAttribute::Integer(val) => val.to_string(),
87            FbxAttribute::Long(val) => val.to_string(),
88            FbxAttribute::Bool(val) => val.to_string(),
89            FbxAttribute::String(val) => val.clone(),
90        }
91    }
92}