use crate::decoders::decoders::Encoding;
use crate::helpers::bytes_helper::{find_delimiter_bounds, get_cleaned};
use crate::io::number_parser::{
parse_f32, parse_f64, parse_i32, parse_i64, parse_i8, parse_u32, parse_u64,
};
use crate::io::parser::parse_bool_str;
use std::borrow::Cow;
#[derive(Debug)]
#[allow(dead_code)]
pub struct Field<'mmap> {
slice: &'mmap [u8],
string_delimiter: u8,
}
impl<'mmap> Field<'mmap> {
pub fn new(slice: &'mmap [u8], string_delimiter: u8) -> Self {
Self {
slice,
string_delimiter,
}
}
pub fn new_empty(string_delimiter: u8) -> Self {
Self {
slice: &[],
string_delimiter,
}
}
pub fn get_slice(&self) -> &[u8] {
self.slice
}
pub fn get_cleaned_slice(&self) -> &'mmap [u8] {
get_cleaned(self.slice, self.string_delimiter)
}
pub fn decode_bytes(&self, encoding: Encoding) -> Cow<str> {
encoding.decode(self.get_cleaned_slice())
}
pub fn is_empty(&self) -> bool {
get_cleaned(self.slice, self.string_delimiter).is_empty()
}
pub fn contains_chars(&self, input: &str, encoding: Encoding) -> bool {
let decoded = encoding.decode(self.get_cleaned_slice());
let base = &decoded.as_ref();
base.contains(input)
}
pub fn is_numeric_like(&self) -> bool {
get_cleaned(self.slice, self.string_delimiter)
.iter()
.all(|b| b.is_ascii_digit() || *b == b'.' || *b == b',' || *b == b'-')
}
pub fn get_utf8_as_str(&self) -> &str {
std::str::from_utf8(get_cleaned(self.slice, self.string_delimiter)).unwrap_or("")
}
pub fn get_as_cow_decoded(&self, encoding: Encoding) -> Cow<str> {
encoding.decode(get_cleaned(self.slice, self.string_delimiter))
}
pub fn get_as_string(&self, encoding: Encoding) -> String {
let enc = encoding.decode(get_cleaned(self.slice, self.string_delimiter));
String::from(enc)
}
pub fn get_i8(&self) -> i8 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
return parse_i8(cleaned);
} else {
let str = self.get_utf8_as_str();
return str.parse().unwrap_or(0);
}
}
pub fn get_u8(&self) -> u8 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_u32(cleaned) as u8
} else {
self.get_utf8_as_str().parse().unwrap_or(0)
}
}
pub fn get_i16(&self) -> i16 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_i32(cleaned) as i16
} else {
self.get_utf8_as_str().parse().unwrap_or(0)
}
}
pub fn get_u16(&self) -> u16 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_u32(cleaned) as u16
} else {
self.get_utf8_as_str().parse().unwrap_or(0)
}
}
pub fn get_i32(&self) -> i32 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_i32(cleaned)
} else {
self.get_utf8_as_str().parse().unwrap_or(0)
}
}
pub fn get_u32(&self) -> u32 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_u32(cleaned)
} else {
self.get_utf8_as_str().parse().unwrap_or(0)
}
}
pub fn get_i64(&self) -> i64 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_i64(cleaned)
} else {
self.get_utf8_as_str().parse().unwrap_or(0)
}
}
pub fn get_u64(&self) -> u64 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_u64(cleaned)
} else {
self.get_utf8_as_str().parse().unwrap_or(0)
}
}
pub fn get_f32(&self) -> f32 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_f32(cleaned)
} else {
self.get_utf8_as_str().parse().unwrap_or(0.0)
}
}
pub fn get_f64(&self) -> f64 {
let cleaned = get_cleaned(self.slice, self.string_delimiter);
if self.is_numeric_like() {
parse_f64(cleaned)
} else {
self.get_utf8_as_str().parse().unwrap_or(0.0)
}
}
pub fn get_boolean(&self) -> bool {
let dec = self.get_utf8_as_str();
parse_bool_str(dec)
}
}