use std::io::{Read, Seek};
use log::warn;
pub use self::error::{Error, Result};
use crate::{
low::{self, FbxVersion},
pull_parser::{self, any::AnyParser},
tree,
};
mod error;
#[non_exhaustive]
pub enum AnyTree {
V7400(
FbxVersion,
tree::v7400::Tree,
std::result::Result<Box<low::v7400::FbxFooter>, pull_parser::Error>,
),
}
impl AnyTree {
pub fn from_reader(reader: impl Read) -> Result<Self> {
match AnyParser::from_reader(reader)? {
AnyParser::V7400(mut parser) => {
let fbx_version = parser.fbx_version();
parser.set_warning_handler(|w, pos| {
warn!("WARNING: {} (pos={:?})", w, pos);
Ok(())
});
let tree_loader = tree::v7400::Loader::new();
let (tree, footer) = tree_loader.load(&mut parser)?;
Ok(AnyTree::V7400(fbx_version, tree, footer))
}
}
}
pub fn from_seekable_reader(reader: impl Read + Seek) -> Result<Self> {
match AnyParser::from_seekable_reader(reader)? {
AnyParser::V7400(mut parser) => {
let fbx_version = parser.fbx_version();
parser.set_warning_handler(|w, pos| {
warn!("WARNING: {} (pos={:?})", w, pos);
Ok(())
});
let tree_loader = tree::v7400::Loader::new();
let (tree, footer) = tree_loader.load(&mut parser)?;
Ok(AnyTree::V7400(fbx_version, tree, footer))
}
}
}
#[inline]
#[must_use]
pub fn fbx_version(&self) -> FbxVersion {
match self {
Self::V7400(ver, _, _) => *ver,
}
}
}