1use std::io::{Read, Seek};
7
8use fbxcel::{low::FbxVersion, tree::any::AnyTree};
9
10pub use self::error::{Error, Result};
11
12mod error;
13
14#[non_exhaustive]
16pub enum AnyDocument {
17 V7400(FbxVersion, Box<crate::v7400::Document>),
19}
20
21impl AnyDocument {
22 pub fn from_reader(reader: impl Read) -> Result<Self> {
28 match AnyTree::from_reader(reader)? {
29 AnyTree::V7400(fbx_version, tree, _footer) => {
30 let doc = crate::v7400::Loader::new().load_from_tree(tree)?;
31 Ok(AnyDocument::V7400(fbx_version, Box::new(doc)))
32 }
33 tree => Err(Error::UnsupportedVersion(tree.fbx_version())),
34 }
35 }
36
37 pub fn from_seekable_reader(reader: impl Read + Seek) -> Result<Self> {
39 match AnyTree::from_seekable_reader(reader)? {
40 AnyTree::V7400(fbx_version, tree, _footer) => {
41 let doc = crate::v7400::Loader::new().load_from_tree(tree)?;
42 Ok(AnyDocument::V7400(fbx_version, Box::new(doc)))
43 }
44 tree => Err(Error::UnsupportedVersion(tree.fbx_version())),
45 }
46 }
47
48 pub fn fbx_version(&self) -> FbxVersion {
50 match self {
51 Self::V7400(ver, _) => *ver,
52 }
53 }
54}