datacard-rs 1.0.0

Generic binary card format library with checksums and pluggable format traits
Documentation
//! # DataCard: Generic Binary Card Format Library
//!
//! DataCard provides a generic binary card format for storing payloads with
//! self-describing metadata and optional CRC32 checksums.
//!
//! ## Generic Card System
//!
//! Implementors define their own card formats by implementing `CardFormat`:
//!
//! ```rust,ignore
//! use datacard_rs::{CardFormat, GenericCard, CardError};
//!
//! pub struct TernsigFormat;
//!
//! impl CardFormat for TernsigFormat {
//!     const MAGIC: [u8; 4] = *b"TERN";
//!     const VERSION_MAJOR: u8 = 1;
//!     const VERSION_MINOR: u8 = 0;
//!
//!     fn format_name() -> &'static str { "Ternsig" }
//! }
//!
//! // Create and use cards
//! let card: GenericCard<TernsigFormat> = GenericCard::new("program", payload);
//! card.save("program.card")?;
//!
//! let loaded: GenericCard<TernsigFormat> = GenericCard::load("program.card")?;
//! ```
//!
//! ## Format Structure
//!
//! ```text
//! ┌────────────────────────────────┐
//! │ Header (8 bytes)               │
//! │   - Magic (4 bytes)            │
//! │   - Version (2 bytes)          │
//! │   - Flags (2 bytes)            │
//! ├────────────────────────────────┤
//! │ Metadata (JSON, length-prefix) │
//! ├────────────────────────────────┤
//! │ Payload (raw bytes)            │
//! ├────────────────────────────────┤
//! │ Footer (4 bytes, optional)     │
//! │   - CRC32 checksum             │
//! └────────────────────────────────┘
//! ```

// Generic card system (preferred)
mod format;
mod generic;
pub mod checksum;
mod error;
mod header;

// Re-export generic API
pub use format::CardFormat;
pub use generic::{GenericCard, GenericHeader, GenericMetadata};
pub use error::{CardError, Result};
pub use header::FLAG_HAS_CHECKSUM;

// =============================================================================
// Legacy CML-specific API (deprecated - will move to content-markup-language)
// =============================================================================

#[deprecated(note = "Use GenericCard with your own CardFormat instead")]
mod card;
#[deprecated(note = "Use GenericMetadata instead")]
mod metadata;

#[allow(deprecated)]
pub use card::Card;
#[allow(deprecated)]
pub use header::{CardHeader, FLAG_HAS_TIMESTAMP, MAGIC, VERSION_MAJOR, VERSION_MINOR};
#[allow(deprecated)]
pub use metadata::CardMetadata;