# Change Log
## [Unreleased]
## [0.9.0]
* Remove `pull_parser::reader` module and items inside.
+ Trait bounds `R: ParserSource` are now replaced with `R: std::io::Read`.
* Change type parameters of `pull_parser::any::AnyParser` and `pull_parser::v7400::Parser`.
* Remove free functions to create parsers, and add inherent methods instead.
* Remove internal dependency to `byteorder` crate.
### Changed (breaking)
* Remove `pull_parser::reader` module and items inside.
+ Trait bounds `R: ParserSource` are now replaced with `R: std::io::Read`.
+ List of removed items:
- `pull_parser::reader` module
- `pull_parser::reader::ParserSource` trait
- `pull_parser::reader::PlainSource` type
- `pull_parser::reader::PositionCacheReader` type
- `pull_parser::reader::SeekableSource` type
* Change type parameters of `pull_parser::any::AnyParser` and `pull_parser::v7400::Parser`.
+ The parameter type of the parser is simplified. Previously parsers were
`{Any,}Parser<{Plain,Seekable}Source<R>>`, but now they are `{Any,}Parser<R>`.
* Remove free functions to create parsers, and add inherent methods instead.
+ List of removed functions and added alternatives:
- `pull_parser::any::from_reader()`: replaced with
`pull_parser::any::AnyParser::from_reader()`.
- `pull_parser::any::from_seekable_reader()`: replaced with
`pull_parser::any::AnyParser::from_seekable_reader()`.
- `pull_parser::v7400::from_reader()`: Replaced with
- `pull_parser::v7400::Parser::from_reader()`.
- `pull_parser::v7400::from_seekable_reader()`: Replaced with
- `pull_parser::v7400::Parser::from_seekable_reader()`.
### Changed (non-breaking)
* Remove internal dependency to `byteorder` crate.
## [0.8.2]
* Add more tree manipulation methods.
### Added
* Add more tree manipulation methods.
+ The methods below are added:
- `tree::v7400::Tree::create_node()`
- `tree::v7400::Tree::append()`
- `tree::v7400::Tree::prepend()`
- `tree::v7400::Tree::insert_after()`
- `tree::v7400::Tree::insert_before()`
- `tree::v7400::Tree::detach()`
## [0.8.1]
* Add types and methods to traverse nodes in depth-first order.
* Add methods to `Tree` to modify node attributes (not only appending).
* Make many (but not all) small methods `#[inline]`.
* Make some funcitions `#[must_use]`.
### Added
* Add types and methods to traverse nodes in depth-first order.
+ `tree::v7400::DepthFirstTraversed` type is added.
+ `tree::v7400::DepthFirstTraverseSubtree` type is added.
* Add methods to `Tree` to modify node attributes (not only appending).
+ `tree::v7400::Tree` has now three new methods: `get_attribute_mut()`,
`take_attributes_vec()`, and `set_attributes_vec()`.
### Changed (non-breaking)
* Make many (but not all) small methods `#[inline]`.
* Make some funcitions `#[must_use]`.
## [0.8.0]
* Bump minimum supported Rust version to 1.56.0.
* Iterator types returned by `tree::v7400::NodeHandle::{children, children_by_name}`
now have a name.
* All iterator types now have `std::iter::FusedIterator` impl.
* `tree::v7400::NodeHandle::first_child_by_name()` is added.
* Now some items on docs.rs have pretty badges indicating the items is only
enabled with some features.
+ This won't affect any builds by other users. `cargo doc --all-features`
and other commands should still run successfully with stable toolchain.
* Bump internal dependencies.
### Added
* `tree::v7400::NodeHandle::first_child_by_name()` is added.
+ `node.first_child_by_name(name)` returns the same result as
`node.children_by_name(name).next()`.
### Fixed
* Fixed incorrect attribute type value being written by the writer.
### Breaking changes
* Bump minimum supported Rust version to 1.56.0.
### Non-breaking changes
* Iterator types returned by `tree::v7400::NodeHandle::{children, children_by_name}`
now have a name.
+ `NodeHandle::children()` returns `Children<'_>`.
+ `NodeHandle::children_by_name()` returns `ChildrenByName<'_>`.
+ By this change, now these iterators can be included in other types as a field.
* All iterator types defined by this crate now have `std::iter::FusedIterator` impl.
## [0.7.0]
* Bump minimum supported Rust version to 1.49.
* Bump internal dependencies.
## [0.6.0]
* Minimum supported Rust version is bumped to 1.40.0.
* Add an FBX version field to `any::AnyTree::V7400` variant
(372a2f6e0314eed86cc2c493d2e2fc86aa226781).
* Add `any::AnyTree::fbx_version()` method (372a2f6e0314eed86cc2c493d2e2fc86aa226781).
### Breaking changes
* Add an FBX version field to `any::AnyTree::V7400` variant
(372a2f6e0314eed86cc2c493d2e2fc86aa226781).
+ This is mainly used by newly added `any::AnyTree::fbx_version()`, but also useful for users to
know FBX version.
- For example, when users want to re-export the tree, they might want to know FBX version of
the source document.
### Added
* Add `any::AnyTree::fbx_version()` method (372a2f6e0314eed86cc2c493d2e2fc86aa226781).
+ Using this, users can get FBX version of the tree even if the `AnyTree` variant is unknown for
users.
+ By this method, users can emit meaningful error message if the tree is returned as unknown
variant.
### Non-breaking changes
* Use `#[non_exhaustive]` instead of hidden dummy variants for enums
(b4c0cf53fcefb2dc13850e09ac1ff15bc57a68e5).
+ Users won't affected by this internal change.
## [0.5.0]
* `pull_parser::error::{DataError, OperationError, Warning}` is now nonexhaustive.
+ This would make some of future changes non-breaking.
* Support parsing nodes with missing or extra node end markers.
+ Previously, they are ignored or causing critical errors.
Now they are notified as warnings, and users can continue parsing.
+ Two new variants `Warning::{ExtraNodeEndMarker, MissingNodeEndMarker}` are added to
`pull_parser::error::Warning` type.
- Note that `Warning` have been nonexhaustive since this release.
* Deprecated items are removed.
+ `low::FbxHeader::read_fbx_header()`
+ `pull_parser::v7400::attribute::DirectAttributeValue`
### Breaking changes
* `pull_parser::error::{DataError, OperationError, Warning}` is now nonexhaustive
(d0651118feabf842f9495da626ccb127090db331).
+ This would make some of future changes non-breaking.
* Support parsing nodes with missing or extra node end markers
(8c3d8b7f210fe8422784ef86b468e5331bb0c2ee).
+ Previously, missing node end markers caused errors, and extra node end markers were silently
ignored.
Now they are notified as warnings.
Users can choose whether to continue or abort processing.
+ Two new variants `Warning::{ExtraNodeEndMarker, MissingNodeEndMarker}` are added to
`pull_parser::error::Warning` type.
- Note that `Warning` have been nonexhaustive since this release.
* Deprecated items are removed (9e38b4217d33ed8bca3f7e8b11d210845a4fa8c1).
+ `low::FbxHeader::read_fbx_header()`
+ `pull_parser::v7400::attribute::DirectAttributeValue`
## [0.4.4]
* Documents are improved a little.
* Manual tree construction (without using parser) is now supported.
+ You can add nodes and attributes manually to the tree at runtime.
+ You can describe the tree using `tree_v7400!` macro at compile time.
* FBX binary writer is added.
* Tiny improvements:
+ `low::v7400::AttributeValue` implements `From<_>` for some types.
+ Strict equality check is added for trees, nodes, and attribute values.
+ `tree::v7400::Tree::debug_tree()` is added.
* Now rustc-1.34 or later is required.
+ To use `std::convert::{TryFrom, TryInto}`.
### Added
* Manual tree construction support is added (64f70b051c30, 39c4fabad119).
+ Methods to add new nodes and attributes are added.
+ Complete modification is not yet supported, for example modifying already
added attributes or removing nodes.
* `tree_v7400!` macro is added to construct tree easily.
See documentation for detail.
* FBX binary writer is added (e1cb2a232d19, 33d9ac3a589c, d5dc779c0bd4,
6cddca849a4f, 8c84359d2578).
+ `writer::v7400::binary` contains FBX binary writer stuff.
+ This can be enabled by `writer` feature.
+ `write_v7400_binary!` macro is also added.
See the documentation for detail.
* `low::v7400::AttributeValue` implements `From<_>` for some types
(a54226534a73, 6546d62fd38a).
+ Primitive types: `bool`, `i16`, `i32`, `i64`, `f32`, `f64`.
+ Vector types: `Vec<bool>`, `Vec<i32>`, `Vec<i64>`, `Vec<f32>`, `Vec<f64>`,
`Vec<u8>`.
+ Slice types: `&[bool]`, `&[i32]`, `&[i64]`, `&[f32]`, `&[f64]`, `&[u8]`.
+ Special types: `String`, `&str`.
* Strict equality check is added for trees, nodes, and attribute values
(8784d7609d8e).
+ Trees: `tree::v7400::Tree::strict_eq()`.
+ Nodes: `tree::v7400::NodeHandle::strict_eq()`.
+ Attributes: `low::v7400::AttributeValue::strict_eq()`.
+ These checks compares `f32` and `f64` bitwise.
This means `NAN == NAN` situation is possible.
* `tree::v7400::Tree::debug_tree()` is added (4524b4dc4a99).
* This returns pretty-printable object of the tree.
* It dumps human-readable tree structure.
* Default `Debug` implementation for `Tree` is hard to read because it dumps
arena and interned string table.
### Non-breaking change
* Now rustc-1.34 or later is required.
+ To use `std::convert::TryFrom`.
+ Strictly, this is a breaking change (for users with rustc-1.33 or below),
but not breaking for users with latest rustc.
+ Currently, only `writer` module uses `TryFrom`.
Users not using `writer` feature won't be affected for now, but they could
encounter compile error in future version of fbxcel.
## [0.4.3]
* Longer lifetime for iterator returned by
`tree::v7400::NodeHandle::children_by_name()`.
### Non-breaking change
* Longer lifetime for iterator returned by
`tree::v7400::NodeHandle::children_by_name()` (08ab27a7fc23).
+ Previously, lifetime of the returned iterator should be same as or shorter
than the `NodeHandle` object.
This was unnecessary restriction.
+ Now the restriction is relaxed. The iterator can live longer, and have
the same lifetime as `Tree` object.
## [0.4.2]
* A bug around `pull_parser::v7400::Parser::skip_current_node()` is fixed.
### Non-breaking change
* `pull_parser::skip_current_node()` now updates parser status correctly
(20f4d82d676a).
+ Previously, internal state of the parser is not updated correctly after
`skip_current_node()`.
This can cause parser error for correct FBX file, because the parser
cannot track correct end position of the next node.
This problem is now fixed.
+ This was overlooked when 5e8d3fbd97e5 was merged...
## [0.4.1]
* Docs are made more detailed, and some examples are added.
* A bug around `pull_parser::v7400::Parser::skip_current_node()` is fixed.
### Added
* `pull_parser::v7400::Parser::is_used()` is added (f55e385c745e).
### Non-breaking change
* `low::FbxHeader::read_fbx_header()` is renamed to `load()` (62f8af93a701).
The old name is deprecated.
* `pull_parser::skip_current_node()` now updates parser status correctly
(5e8d3fbd97e5).
+ Previously the parser status is not updated correctly after
`skip_current_node()`.
This can cause parser error for correct FBX file, because the parser was
not able to determine presence of node end marker.
This problem is now fixed.
* `tree::v7400::Loader::load()` now check parser status more precisely
(f55e385c745e).
+ Previously, the check is loose and some of already used parser could be
accepted.
Now this check is fixed perfectly, and invalid parser is rejected as
expected.
#### Deprecation
* `low::FbxHeader::read_fbx_header()` is deprecated (62f8af93a701).
+ Use `low::FbxHeader::load()` instead.
## [0.4.0]
* **`dom` module is now split to another crate,
[`fbxcel-dom`](https://github.com/lo48576/fbxcel-dom)**.
+ If you want to interpret and render FBX data, use it.
* Object properties are supported.
+ Very basic support, but would be useful.
* Huge refactoring around attribute values.
+ Many types, modules, and functions are renamed and moved.
* `{pull_parser,tree}::any` module is added.
+ They provide mostly version-independent way to read and load the FBX data.
### Breaking change
#### Prefer "load" to "visit" for node attributes
* `pull_parser::v7400::attribute::VisitAttribute` is changed to
`pull_parser::v7400::attribute::LoadAttribute`.
+ `VisitAttributeValue::visit_*` is renamed to `LoadAttribute::load_*`.
* `pull_parser::v7400::attribute::Attributes::visit_*` is renamed to
`Attributes::load_*`.
* `pull_parser::ParserVersion` is now nonexhaustive.
+ By this change, it is non-breaking change to add new parser version in
future.
### Non-breaking change
* Attributes slice returned by `tree::v7400::NodeHandle::attributes()` now have
same lifetime as the tree.
+ The lifetime was mistakenly set too short in previous implementation, but
this is now fixed.
#### Deprecation
* `pull_parser::v7400::attribute:DirectAttributeValue` is now deprecated.
+ It is moved to `low::v7400::AttributeValue`.
+ Now `DirectAttributeValue` is a type alias to
`low::v7400::AttributeValue`.
+ The type alias will exist for a while, but will be removed in future
version.
## [0.3.0]
* `dom` module is completely rewritten.
+ **No compatibility** with old (0.2.0) `dom` module.
* `tree` module is added.
+ This can be enabled with `tree` feature.
### Breaking changes
* `dom` module is completely rewritten.
+ **No compatibility** with old (0.2.0) `dom` module.
### Added
* `tree` module is added.
+ This can be enabled with `tree` feature.
+ `tree::v7400::Tree` manages raw FBX tree data, but do not touch their
meanings.
* `pull_parser::v7400::attribute::DirectAttributeValue::get_{{types}}_or_type()`
are added.
+ `{{types}}` are: `bool`, `i16`, `i32`, `i64`, `f32`, `f64`, `arr_bool`,
`arr_i32`, `arr_i64`, `arr_f32`, `arr_f64`, `string`, and `binary`.
+ This enables using type info at method chain, for example
`let val = attr.get_i64_or_type().map_err(|ty|
Error::new("Expected i64 but got {:?}", ty))?;`.
## [0.2.0]
* Syntactic position information for pull parser is supported.
Syntactic position contains node path, node index, attribute index, etc.
This will make errors and warnings more detailed and useful.
* Quite basic DOM is implemented.
This is not yet practically usable.
### Breaking changes
* `pull_parser::v7400::Parser::set_warning_handler()` now requires
`'static + FnMut(Warning, &SyntacticPosition) -> Result<()>` as warning
hander (note that `&SyntacticPosition` argument is added).
+ By this change, warning handler can use position information where the
warning happened.
* `low::FbxHeader::read_fbx_header` now takes `impl std::io::Read` instead of a
type parameter.
### Added
* `dom` module is added.
+ This can be enabled by `dom` feature, but this is not yet practically
usable.
* `pull_parser::SyntacticPosition` is added.
* `pull_parser::error::Error::position()` is added.
* `pull_parser::v7400::Parser::skip_current_node()` is added.
* `pull_parser::v7400::attribute::Attributes::iter{,_buffered}` and
`pull_parser::v7400::attribute::iter` module are added.
* `pull_parser::v7400::attribute::DirectAttributeValue::get_{{types}}()` are
added.
+ `{{types}}` are: `bool`, `i16`, `i32`, `i64`, `f32`, `f64`, `arr_bool`,
`arr_i32`, `arr_i64`, `arr_f32`, `arr_f64`, `string`, and `binary`.
## [0.1.0]
Totally rewritten.
[Unreleased]: <https://github.com/lo48576/fbxcel/compare/v0.9.0...develop>
[0.9.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.9.0>
[0.8.2]: <https://github.com/lo48576/fbxcel/releases/tag/v0.8.2>
[0.8.1]: <https://github.com/lo48576/fbxcel/releases/tag/v0.8.1>
[0.8.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.8.0>
[0.7.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.7.0>
[0.6.1]: <https://github.com/lo48576/fbxcel/releases/tag/v0.6.1>
[0.6.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.6.0>
[0.5.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.5.0>
[0.4.4]: <https://github.com/lo48576/fbxcel/releases/tag/v0.4.4>
[0.4.3]: <https://github.com/lo48576/fbxcel/releases/tag/v0.4.3>
[0.4.2]: <https://github.com/lo48576/fbxcel/releases/tag/v0.4.2>
[0.4.1]: <https://github.com/lo48576/fbxcel/releases/tag/v0.4.1>
[0.4.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.4.0>
[0.3.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.3.0>
[0.2.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.2.0>
[0.1.0]: <https://github.com/lo48576/fbxcel/releases/tag/v0.1.0>