1#![allow(clippy::derive_partial_eq_without_eq)]
4extern crate num;
5#[macro_use]
6extern crate num_derive;
7extern crate ibmfloat;
8
9#[cfg(feature = "serde")]
10extern crate serde;
11#[cfg(feature = "to_json")]
12extern crate serde_json;
13
14pub mod bitconverter;
15pub mod enums;
16pub mod errors;
17pub mod header_structs;
18pub mod settings;
19#[cfg(test)]
20mod tests;
21
22pub use errors::RsgError;
23
24pub use enums::*;
25pub use header_structs::*;
26pub use settings::SegySettings;
27
28pub const TAPE_LABEL_LEN: usize = 128;
29pub const TEXT_HEADER_LEN: usize = 3200;
30pub const BIN_HEADER_LEN: usize = 400;
31pub const TRACE_HEADER_LEN: usize = 240;
32pub const INLINE_BYTE_LOCATION: usize = 188;
33pub const CROSSLINE_BYTE_LOCATION: usize = 192;
34pub const CDPX_BYTE_LOCATION: usize = 180;
35pub const CDPY_BYTE_LOCATION: usize = 184;
36
37#[derive(Debug, Clone, PartialEq)]
42#[repr(C)]
43#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
44pub struct Trace {
45 pub(crate) trace_header: TraceHeader,
47 pub(crate) trace_start_byte: usize,
49 pub(crate) trace_byte_len: usize,
51}
52
53pub struct SegyMetadata<S> {
59 pub tape_label: Option<TapeLabel>,
60 pub text_header: String,
61 pub extended_headers: Vec<String>,
62 pub bin_header: BinHeader,
63 pub settings: S,
64}
65
66impl Trace {
67 pub fn new(trace_header: TraceHeader, data_start: usize, data_len: usize) -> Self {
90 Trace {
91 trace_header,
92 trace_start_byte: data_start,
93 trace_byte_len: data_len,
94 }
95 }
96
97 pub fn get_header(&self) -> &TraceHeader {
99 &self.trace_header
100 }
101
102 pub fn get_start(&self) -> usize {
104 self.trace_start_byte
105 }
106
107 pub fn len(&self) -> usize {
109 self.trace_byte_len
110 }
111
112 pub fn is_empty(&self) -> bool {
114 self.len() == 0
115 }
116}
117
118impl<S> SegyMetadata<S> {
119 pub fn new(
120 tape_label: Option<TapeLabel>,
121 text_header: String,
122 extended_headers: Vec<String>,
123 bin_header: BinHeader,
124 settings: S,
125 ) -> Self {
126 Self {
127 tape_label,
128 text_header,
129 extended_headers,
130 bin_header,
131 settings,
132 }
133 }
134
135 pub fn get_settings(&self) -> &S {
137 &self.settings
138 }
139
140 pub fn get_tape_label(&self) -> &Option<TapeLabel> {
142 &self.tape_label
143 }
144
145 pub fn get_text_header(&self) -> &str {
147 &self.text_header
148 }
149
150 pub fn extended_headers_iter(&self) -> std::slice::Iter<'_, String> {
152 self.extended_headers.iter()
153 }
154
155 pub fn get_extended_headers(&self) -> &[String] {
157 &self.extended_headers
158 }
159
160 pub fn get_text_header_lines(&self) -> Vec<String> {
163 self.text_header
164 .chars()
165 .collect::<Vec<char>>()
166 .as_slice()
167 .chunks(80)
168 .map(|c| c.iter().collect::<String>())
169 .collect::<Vec<String>>()
170 }
171
172 pub fn get_bin_header(&self) -> &BinHeader {
174 &self.bin_header
175 }
176
177 pub fn get_readable_tape_label(&self) -> Option<ReadableTapeLabel> {
179 self.tape_label.as_ref().map(|l| l.to_readable())
180 }
181
182 pub fn deconstruct(self) -> (Option<TapeLabel>, String, Vec<String>, BinHeader, S) {
186 let SegyMetadata {
187 tape_label,
188 text_header,
189 extended_headers,
190 bin_header,
191 settings,
192 } = self;
193 (
194 tape_label,
195 text_header,
196 extended_headers,
197 bin_header,
198 settings,
199 )
200 }
201}