Expand description
Garmin FIT protocol SDK for Rust — pure-Rust decoder + encoder for v21.200
.fit files (workouts, activities, courses, settings, etc.).
§Quick start
use fit::{Decoder, Encoder};
let bytes = std::fs::read("Activity.fit")?;
// Decode every message with all transforms applied (DateTime, enum
// strings, scale/offset, components, sub-fields, dev fields).
let (messages, errors) = Decoder::builder(&bytes).build().read_all();
assert!(errors.is_empty());
// Encode the typed messages back into a FIT binary.
let encoded: Vec<u8> = Encoder::new().encode(&messages)?;
fit::check_integrity(&encoded)?;§Module map
| API | Purpose |
|---|---|
is_fit / check_integrity | Quick file-level validation |
FileHeader / ByteStream | Low-level header + byte cursor |
Decoder / RawMessage | Streaming raw-message iterator |
DecoderBuilder / TypedDecoder / Message | Profile-aware typed pipeline |
Encoder / EncoderBuilder | Round-trip back to FIT binary |
crc / base_type / record_header | Protocol primitives |
profile | Generated Profile.xlsx tables (see MesgNum, MesgInfo, FieldInfo) |
transforms | Re-exports of the M5 transform helpers (datetime / enum / scale / components) |
merge_heart_rates / decode_memo_glob | M6 post-processing helpers |
FitError | Single error type used by every fallible operation |
See the repository for the milestone log and companion tools.
Re-exports§
pub use base_type::BaseType;pub use dev_fields::DevFieldInfo;pub use dev_fields::DevFieldRegistry;pub use transforms::decode_memo_glob;pub use transforms::merge_heart_rates;
Modules§
- base_
type - FIT base types — the 17 primitive wire types referenced by every Definition message’s field-type byte.
- crc
- CRC-16 calculation for FIT files.
- datetime
- FIT timestamp conversions.
- dev_
fields - Developer field schema registry.
- output_
stream - Growing byte buffer with little-endian write helpers.
- profile
- FIT profile metadata: enum types, message numbers, and per-field schema.
- transforms
- Transform pipeline that converts a
RawMessageinto a typedMessage.
Structs§
- Byte
Stream - A read cursor over a borrowed byte slice.
- Decoder
- The streaming decoder. Implements
Iteratoryielding oneResult<RawMessage, FitError>per Data record. - Decoder
Builder - Builder for
TypedDecoder. Created byDecoder::builder. - Developer
Field Definition - One developer-field reference inside a Definition.
- Encoder
- FIT file encoder.
- Encoder
Builder - Chainable builder for
Encoder. Defaults matchEncoder::new. - Field
- One field of a fully-transformed message.
- Field
Definition - One field’s wire-level shape inside a Definition message.
- File
Header - Parsed FIT file header.
- Local
Definitions - The 16-slot local-definition table.
- Message
- A fully-transformed FIT message.
- Message
Definition - A complete Definition message.
- RawDev
Field - A developer field’s wire bytes, awaiting M6 schema resolution.
- RawField
- A standard field’s decoded value.
- RawMessage
- One decoded FIT message.
- Transform
Options - Toggleable transforms. All default to
true(matches the JS SDK’s “decode richly” preset). Disable individually to get cheaper / less opinionated output. - Typed
Decoder - Typed-message iterator. Yields one
Messageper Data record from the underlyingDecoder.
Enums§
- Endian
- Endianness selector for multi-byte reads.
- Field
Kind - Provenance of a field — distinguishes Profile-declared standard fields from runtime-registered developer fields.
- Field
TooLarge Kind - Tag identifying which protocol field exceeded its 255-byte u8 cap. Kept
separate so
FitErrorstays heap-free. - FitError
- Anything that can go wrong while reading a FIT file.
- RawValue
- A decoded field value.
- Record
Header - Classification of a single record-header byte.
- Value
- A fully-transformed field value.
Constants§
- LOCAL_
DEFINITION_ SLOTS - Maximum number of simultaneously valid local message definitions.
Functions§
- check_
integrity - Fully verify a FIT file’s CRCs.
- crc16
- Compute the CRC-16 over a byte slice. Thin wrapper around
crc::calculate. - is_fit
- Quick check: does this byte slice plausibly hold a FIT file?