Skip to main content

miniseed_rs/
types.rs

1//! Shared types: [`ByteOrder`], [`EncodingFormat`], and [`FormatVersion`].
2
3use std::fmt;
4
5use crate::{MseedError, Result};
6
7/// miniSEED format version.
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum FormatVersion {
10    /// miniSEED v2 (SEED Manual, 48-byte fixed header + blockettes).
11    V2,
12    /// miniSEED v3 (FDSN, 40-byte fixed header, little-endian).
13    V3,
14}
15
16impl fmt::Display for FormatVersion {
17    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18        match self {
19            Self::V2 => write!(f, "miniSEED v2"),
20            Self::V3 => write!(f, "miniSEED v3"),
21        }
22    }
23}
24
25/// Byte order for multi-byte fields in a miniSEED record.
26#[derive(Debug, Clone, Copy, PartialEq, Eq)]
27pub enum ByteOrder {
28    Big,
29    Little,
30}
31
32/// Encoding format for sample data in a miniSEED v2 record.
33#[derive(Debug, Clone, Copy, PartialEq, Eq)]
34pub enum EncodingFormat {
35    /// 16-bit signed integer (code 1).
36    Int16,
37    /// 32-bit signed integer (code 3).
38    Int32,
39    /// 32-bit IEEE float (code 4).
40    Float32,
41    /// 64-bit IEEE double (code 5).
42    Float64,
43    /// Steim-1 compressed integers (code 10).
44    Steim1,
45    /// Steim-2 compressed integers (code 11).
46    Steim2,
47}
48
49impl EncodingFormat {
50    /// Convert a raw encoding code (from Blockette 1000) to an `EncodingFormat`.
51    pub fn from_code(code: u8) -> Result<Self> {
52        match code {
53            1 => Ok(Self::Int16),
54            3 => Ok(Self::Int32),
55            4 => Ok(Self::Float32),
56            5 => Ok(Self::Float64),
57            10 => Ok(Self::Steim1),
58            11 => Ok(Self::Steim2),
59            _ => Err(MseedError::UnsupportedEncoding(code)),
60        }
61    }
62
63    /// Convert to the raw encoding code for Blockette 1000.
64    pub fn to_code(self) -> u8 {
65        match self {
66            Self::Int16 => 1,
67            Self::Int32 => 3,
68            Self::Float32 => 4,
69            Self::Float64 => 5,
70            Self::Steim1 => 10,
71            Self::Steim2 => 11,
72        }
73    }
74}
75
76impl fmt::Display for EncodingFormat {
77    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
78        match self {
79            Self::Int16 => write!(f, "INT16"),
80            Self::Int32 => write!(f, "INT32"),
81            Self::Float32 => write!(f, "FLOAT32"),
82            Self::Float64 => write!(f, "FLOAT64"),
83            Self::Steim1 => write!(f, "Steim1"),
84            Self::Steim2 => write!(f, "Steim2"),
85        }
86    }
87}