#![allow(clippy::derive_partial_eq_without_eq)]
extern crate num;
#[macro_use]
extern crate num_derive;
extern crate ibmfloat;
#[cfg(feature = "serde")]
extern crate serde;
#[cfg(feature = "to_json")]
extern crate serde_json;
pub mod bitconverter;
pub mod enums;
pub mod errors;
pub mod header_structs;
pub mod settings;
#[cfg(test)]
mod tests;
pub use errors::RsgError;
pub use enums::*;
pub use header_structs::*;
pub use settings::SegySettings;
pub const TAPE_LABEL_LEN: usize = 128;
pub const TEXT_HEADER_LEN: usize = 3200;
pub const BIN_HEADER_LEN: usize = 400;
pub const TRACE_HEADER_LEN: usize = 240;
pub const INLINE_BYTE_LOCATION: usize = 188;
pub const CROSSLINE_BYTE_LOCATION: usize = 192;
pub const CDPX_BYTE_LOCATION: usize = 180;
pub const CDPY_BYTE_LOCATION: usize = 184;
#[derive(Debug, Clone)]
#[repr(C)]
pub struct Trace {
pub(crate) trace_header: TraceHeader,
pub(crate) trace_start_byte: usize,
pub(crate) trace_byte_len: usize,
}
pub struct SegyMetadata<S> {
pub tape_label: Option<TapeLabel>,
pub text_header: String,
pub extended_headers: Vec<String>,
pub bin_header: BinHeader,
pub settings: S,
}
impl Trace {
pub fn new(trace_header: TraceHeader, data_start: usize, data_len: usize) -> Self {
Trace {
trace_header,
trace_start_byte: data_start,
trace_byte_len: data_len,
}
}
pub fn get_header(&self) -> &TraceHeader {
&self.trace_header
}
pub fn get_start(&self) -> usize {
self.trace_start_byte
}
pub fn len(&self) -> usize {
self.trace_byte_len
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<S> SegyMetadata<S> {
pub fn new(
tape_label: Option<TapeLabel>,
text_header: String,
extended_headers: Vec<String>,
bin_header: BinHeader,
settings: S,
) -> Self {
Self {
tape_label,
text_header,
extended_headers,
bin_header,
settings,
}
}
pub fn get_settings(&self) -> &S {
&self.settings
}
pub fn get_tape_label(&self) -> &Option<TapeLabel> {
&self.tape_label
}
pub fn get_text_header(&self) -> &str {
&self.text_header
}
pub fn extended_headers_iter(&self) -> std::slice::Iter<String> {
self.extended_headers.iter()
}
pub fn get_extended_headers(&self) -> &[String] {
&self.extended_headers
}
pub fn get_text_header_lines(&self) -> Vec<String> {
self.text_header
.chars()
.collect::<Vec<char>>()
.as_slice()
.chunks(80)
.map(|c| c.iter().collect::<String>())
.collect::<Vec<String>>()
}
pub fn get_bin_header(&self) -> &BinHeader {
&self.bin_header
}
pub fn get_readable_tape_label(&self) -> Option<ReadableTapeLabel> {
self.tape_label.as_ref().map(|l| l.to_readable())
}
pub fn deconstruct(self) -> (Option<TapeLabel>, String, Vec<String>, BinHeader, S) {
let SegyMetadata {
tape_label,
text_header,
extended_headers,
bin_header,
settings,
} = self;
(
tape_label,
text_header,
extended_headers,
bin_header,
settings,
)
}
}