Skip to main content

limnifs_core/
lib.rs

1//! `LimniFS` core reader: manifest header + section parsers, plus the
2//! drop-store primitives (slab header, drop record, slab index).
3//!
4//! Source of truth: `limnifs/spec` §3 (drop store), §5 (manifest
5//! sections), and the bit-level files under `bit-level/`.
6//!
7//! Architecture: every parser takes a [`cursor::ManifestCursor`] and
8//! returns the parsed value plus the cursor advanced past the section.
9//! Bounds checks live in one place (the cursor); each parser focuses
10//! on the structural invariants of its own section. Adding a new
11//! section is a new module + a new parser function — no edits to
12//! existing parsers ([OCP](https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle)).
13//!
14//! ## Module map
15//!
16//! | Module | Owns |
17//! |---|---|
18//! | [`cursor`] | [`ManifestCursor`] — bounded reader over `&[u8]` |
19//! | [`error`] | [`CoreError`] |
20//! | [`header`] | [`ManifestHeader`] + [`parse_manifest_header`] |
21//! | [`feature_flags`] | [`FeatureFlag`], [`FeatureFlags`] + [`parse_feature_flags_section`] |
22//! | [`metadata_reference`] | [`MetadataReference`] + [`parse_metadata_reference`] |
23//! | [`metadata`] | [`MetadataBlob`] + [`parse_metadata_blob`] |
24//! | [`inode`] | [`Inode`], [`ContentHandle`] + [`parse_inode`] |
25//! | [`directory_node`] | [`DirectoryNode`], [`DirEntry`] + [`parse_directory_node`] |
26//! | [`slab_index`] | [`SlabIndex`], [`SlabIndexEntry`] + [`parse_slab_index`] |
27//! | [`history`] | [`HistoryEntry`], [`History`] + [`parse_history`] |
28//! | [`merkle`] | [`SectionHashes`], [`compute_merkle_root`] |
29//! | [`slab`] | [`SlabHeader`] + [`parse_slab_header`] |
30//! | [`slab_reader`] | [`SlabView`] + [`parse_slab`] — locate and read drop plaintexts |
31//! | [`drop_record`] | [`DropRecord`] + [`parse_drop_record`] |
32//! | [`locator`] | [`LocatorEntry`] + [`parse_locator_entry`] |
33
34#![deny(unsafe_code)]
35#![allow(warnings)]
36
37pub mod aead;
38pub mod aead_ops;
39pub mod categorization_policy;
40pub mod chunking_config;
41pub mod codec;
42pub mod compression_tournament_config;
43pub mod crypto;
44pub mod cursor;
45pub mod delta_linkage;
46pub mod dictionary_section;
47pub mod directory_node;
48pub mod dms_policy;
49pub mod dms_scheme;
50pub mod drop_record;
51pub mod ec_params;
52pub mod ec_repair;
53pub mod ec_scheme;
54pub mod encryption_descriptor;
55pub mod epoch;
56pub mod error;
57pub mod feature_flags;
58pub mod fetch;
59pub mod gf256;
60pub mod header;
61pub mod history;
62#[cfg(feature = "http")]
63pub mod http_locator;
64pub mod inode;
65#[cfg(all(target_os = "linux", feature = "io-uring"))]
66pub mod iouring_slab_source;
67#[cfg(feature = "http")]
68pub mod ipfs_locator;
69#[cfg(feature = "key-wrap")]
70pub mod key_wrap;
71pub mod live_tree;
72pub mod locator;
73pub mod merkle;
74pub mod metadata;
75pub mod metadata_reference;
76pub mod profile_descriptor;
77pub mod read;
78pub mod reed_solomon;
79#[cfg(feature = "http")]
80pub mod s3_locator;
81pub mod seekable;
82pub mod shamir;
83#[cfg(feature = "signing")]
84pub mod signing;
85pub mod slab;
86pub mod slab_cache;
87pub mod slab_index;
88pub mod slab_reader;
89pub mod slab_source;
90pub mod slab_store;
91
92pub use cursor::ManifestCursor;
93pub use directory_node::{parse_directory_node, DirEntry, DirectoryNode, DIRECTORY_NODE_VERSION};
94pub use dms_policy::{
95    parse_dms_policy, parse_dms_policy_with_ceilings, DmsPolicy, ShareRecord,
96    DEFAULT_HINT_MAX_BYTES, DEFAULT_SHARE_DATA_MAX_BYTES, DMS_POLICY_SECTION_VERSION,
97    DMS_SCHEME_EXTENDED, DMS_SCHEME_SHAMIR, MAX_TOTAL_SHARES,
98};
99pub use drop_record::{
100    parse_drop_record, parse_drop_record_with_ceiling, DropRecord, DROP_RECORD_LEN,
101};
102pub use ec_params::{
103    parse_ec_params, EcOverride, EcParams, DEFAULT_EC_POLYNOMIAL, EC_PARAMS_SECTION_VERSION,
104    MAX_SHARDS,
105};
106pub use error::CoreError;
107pub use feature_flags::{
108    parse_feature_flags_section, FeatureFlag, FeatureFlags, FEATURE_FLAGS_SECTION_VERSION,
109};
110pub use header::{parse_manifest_header, ManifestHeader};
111pub use history::{
112    parse_history, parse_history_with_ceiling, History, HistoryEntry, HistoryOp,
113    DEFAULT_HISTORY_PARAMS_MAX_BYTES, HISTORY_SECTION_VERSION, OP_EXTENDED,
114};
115pub use inode::{
116    parse_inode, parse_inode_with_ceiling, ContentHandle, Inode, SliceRef, XAttr,
117    DEFAULT_INLINE_DATA_MAX_BYTES, INODE_FIXED_PREFIX_LEN, INODE_FLAG_ATIME,
118    INODE_FLAG_INLINE_DATA, INODE_FLAG_RESERVED_MASK, INODE_FLAG_SHARED_INLINE, S_IFBLK, S_IFCHR,
119    S_IFDIR, S_IFIFO, S_IFLNK, S_IFMT, S_IFREG, S_IFSOCK,
120};
121pub use locator::{
122    parse_locator_entries, parse_locator_entries_with_ceiling, parse_locator_entry,
123    parse_locator_entry_with_ceiling, LocatorEntry, DEFAULT_LOCATOR_MAX_URI_BYTES,
124    LOCATOR_LENGTH_PREFIX_LEN, MIN_LOCATOR_URI_BYTES,
125};
126pub use merkle::{
127    compute_merkle_root, hash_empty_section, hash_section, section_hashes_minimal, SectionHashes,
128    MERKLE_DOMAIN_SEPARATOR,
129};
130pub use metadata::{
131    dir_node_hash, parse_metadata_blob, parse_metadata_blob_with_ceiling, MetadataBlob,
132};
133pub use metadata_reference::{
134    parse_metadata_reference, parse_metadata_reference_with_ceilings, read_external_metadata,
135    MetadataReference, DEFAULT_INLINE_METADATA_MAX_BYTES, METADATA_REFERENCE_SECTION_VERSION,
136    METADATA_REFERENCE_SECTION_VERSION_2,
137};
138pub use slab::{
139    parse_slab_header, parse_slab_header_with_ceiling, SlabHeader, CRYPTO_HINT_EXTENDED,
140    DEFAULT_SLAB_MAX_BYTES, EC_DESCRIPTOR_EXTENDED, SLAB_FORMAT_VERSION, SLAB_HEADER_LEN,
141};
142pub use slab_index::{
143    parse_slab_index, parse_slab_index_with_ceiling, SlabIndex, SlabIndexEntry,
144    SLAB_INDEX_SECTION_VERSION,
145};
146pub use slab_reader::{parse_slab, SlabView};
147
148#[cfg(feature = "http")]
149pub use http_locator::HttpLocator;
150#[cfg(feature = "http")]
151pub use s3_locator::{S3Locator, DEFAULT_S3_ENDPOINT};
152
153pub use limnifs_format::{ManifestRoot, MANIFEST_HEADER_LEN};