Skip to main content

miniseed_rs/
lib.rs

1//! Pure Rust miniSEED v2 and v3 decoder and encoder.
2//!
3//! Zero `unsafe`, zero C dependencies. Supports Steim1/2 compression,
4//! uncompressed INT16/32, FLOAT32/64, automatic v2/v3 format detection,
5//! CRC-32C integrity checking, and FDSN Source Identifiers.
6//!
7//! # Decoding a record
8//!
9//! ```
10//! use miniseed_rs::{decode, encode, MseedRecord, Samples};
11//!
12//! // Build a record, encode it, then decode the bytes
13//! let record = MseedRecord::new()
14//!     .with_nslc("IU", "ANMO", "00", "BHZ")
15//!     .with_sample_rate(20.0)
16//!     .with_samples(Samples::Int(vec![100, 200, 300]));
17//!
18//! let bytes = encode(&record).unwrap();
19//! let decoded = decode(&bytes).unwrap();
20//!
21//! assert_eq!(decoded.network, "IU");
22//! assert_eq!(decoded.station, "ANMO");
23//! assert_eq!(decoded.samples.len(), 3);
24//! ```
25//!
26//! # Iterating multi-record data
27//!
28//! ```
29//! use miniseed_rs::{encode, MseedRecord, MseedReader, Samples};
30//!
31//! // Concatenate two encoded records
32//! let r1 = MseedRecord::new()
33//!     .with_nslc("IU", "ANMO", "00", "BHZ")
34//!     .with_samples(Samples::Int(vec![1, 2, 3]));
35//! let r2 = MseedRecord::new()
36//!     .with_nslc("IU", "ANMO", "00", "BHN")
37//!     .with_samples(Samples::Int(vec![4, 5, 6]));
38//!
39//! let mut data = encode(&r1).unwrap();
40//! data.extend_from_slice(&encode(&r2).unwrap());
41//!
42//! let records: Vec<_> = MseedReader::new(&data)
43//!     .collect::<Result<Vec<_>, _>>()
44//!     .unwrap();
45//!
46//! assert_eq!(records.len(), 2);
47//! assert_eq!(records[0].channel, "BHZ");
48//! assert_eq!(records[1].channel, "BHN");
49//! ```
50//!
51//! # Building a v2 record
52//!
53//! ```
54//! use miniseed_rs::{MseedRecord, Samples, EncodingFormat, BTime, NanoTime, encode};
55//!
56//! let record = MseedRecord::new()
57//!     .with_nslc("XX", "TEST", "00", "BHZ")
58//!     .with_start_time(NanoTime::from_btime(&BTime {
59//!         year: 2025, day: 100, hour: 12,
60//!         minute: 30, second: 45, fract: 0,
61//!     }))
62//!     .with_sample_rate(20.0)
63//!     .with_encoding(EncodingFormat::Int32)
64//!     .with_samples(Samples::Int(vec![1, -2, 3, -4]));
65//!
66//! let bytes = encode(&record).unwrap();
67//! assert_eq!(bytes.len(), 512);
68//! ```
69//!
70//! # Building a v3 record
71//!
72//! ```
73//! use miniseed_rs::{MseedRecord, Samples, EncodingFormat, NanoTime, FormatVersion, encode, decode};
74//!
75//! let record = MseedRecord::new_v3()
76//!     .with_nslc("IU", "ANMO", "00", "BHZ")
77//!     .with_start_time(NanoTime {
78//!         year: 2025, day: 100, hour: 12,
79//!         minute: 30, second: 45, nanosecond: 500_000_000,
80//!     })
81//!     .with_sample_rate(20.0)
82//!     .with_encoding(EncodingFormat::Steim2)
83//!     .with_samples(Samples::Int(vec![1, -2, 3, -4]));
84//!
85//! let bytes = encode(&record).unwrap();
86//! let decoded = decode(&bytes).unwrap();
87//! assert_eq!(decoded.format_version, FormatVersion::V3);
88//! assert_eq!(decoded.start_time.nanosecond, 500_000_000);
89//! ```
90
91pub mod crc;
92pub mod decode;
93pub mod decode_v3;
94pub mod encode;
95pub mod encode_v3;
96pub mod error;
97pub mod reader;
98pub mod record;
99pub mod sid;
100pub mod steim;
101pub mod time;
102pub mod types;
103
104pub use error::{MseedError, Result};
105pub use reader::MseedReader;
106pub use record::{MseedRecord, Samples};
107pub use sid::SourceId;
108pub use time::{BTime, NanoTime};
109pub use types::{ByteOrder, EncodingFormat, FormatVersion};
110
111pub use decode::decode;
112pub use encode::encode;