#[must_use]
pub fn text(line: &str, from: usize, to: usize) -> &str {
raw(line, from, to).trim()
}
#[must_use]
pub fn raw(line: &str, from: usize, to: usize) -> &str {
let Some(start) = from.checked_sub(1) else {
return "";
};
let end = to.min(line.len());
if start >= end {
return "";
}
let Some(field) = line.get(start..end) else {
return "";
};
field
}
#[must_use]
pub fn record(line: &str) -> &str {
text(line, 1, 6)
}
#[must_use]
pub fn integer(line: &str, from: usize, to: usize) -> Option<i64> {
let field = text(line, from, to);
if field.is_empty() {
None
} else {
field.parse().ok()
}
}
#[must_use]
pub fn real(line: &str, from: usize, to: usize) -> Option<f64> {
let field = text(line, from, to);
if field.is_empty() {
None
} else {
field.parse().ok()
}
}
#[cfg(test)]
#[path = "fields_tests.rs"]
mod tests;