Skip to main content

car/
lib.rs

1//! Stable high-level parser for Apple `.car` asset catalogs.
2//!
3//! Most callers should start with [`Car`] and [`CSIItem`]. The crate root
4//! exposes the stable document and rendition surface, while [`raw`] contains
5//! binary-layout models for tooling or low-level inspection.
6//!
7//! When the `image` feature is enabled, [`image`] exposes free functions for
8//! decoding or writing image assets without reaching into parser internals.
9
10mod apple_compression;
11pub mod asset;
12mod car;
13pub mod decode;
14pub mod diagnostics;
15pub mod export;
16#[cfg(feature = "image")]
17pub mod image;
18mod image_conv;
19pub mod metadata;
20mod model;
21pub mod output;
22pub mod raw;
23pub mod view;
24
25pub use bom::ByteSlice as PayloadBytes;
26
27pub use crate::asset::{
28    AssetEntry, AssetId, AssetKind, AssetVariant, AttributeSet, PayloadKind,
29    ResolvedPayloadSummary, TypedAttribute, VariantAttributes, VariantMatchError, VariantQuery,
30    asset_kind_for_item, payload_kind_for_item,
31};
32pub use crate::car::{
33    CSIItem, Car, CarError, CarResult, FacetItem, ReferenceRect, ReferenceResolveError,
34    ResolvedInternalReference,
35};
36pub use crate::decode::{
37    DecodeBudgetError, DecodeOptions, DecodeStage, OrientationPolicy, RenditionData,
38    RenditionDataRef,
39};
40pub use crate::diagnostics::{
41    DiagnosticIssue, DiagnosticsReport, DiagnosticsTotals, EntryDiagnostics, UnsupportedReason,
42};
43pub use crate::image_conv::RgbaPayload;
44pub use crate::metadata::{
45    ExifOrientation, TlvMetadata, TlvMetric, TlvMetrics, TlvRect, TlvReference, UnknownTlv,
46};
47pub use crate::model::rendition;
48pub use crate::model::{
49    CSIHeader, CSIMetadata, ColorModel, ColorSpace, Encoding, ExtendedMetadata, Header,
50};
51pub use crate::output::{
52    OutputIdentity, OutputIdentityKind, default_raw_extension, default_raw_extension_for_item,
53    rendition_scale, suggested_file_name, supported_output_identity,
54};
55
56pub(crate) fn deku_read_str(bytes: Vec<u8>) -> Result<String, deku::DekuError> {
57    Ok(String::from_utf8_lossy(&bytes)
58        .trim_end_matches('\0')
59        .to_string())
60}