use padder::{Alignment, Symbol};
use std::str::{from_utf8_unchecked, FromStr};
use std::usize;
use crate::parser::Parser;
use crate::trimmer::{FloatTrimmer, IntTrimmer, TextTrimmer};
pub struct BooleanParser {
trimmer: TextTrimmer,
}
impl BooleanParser {
pub fn new(alignment: Alignment, trim_symbol: Symbol) -> Self {
Self {
trimmer: TextTrimmer::new(alignment, trim_symbol),
}
}
pub fn try_parse(&self, bytes: &[u8], n_runes: usize) -> (usize, Option<bool>) {
let end_byte_idx: usize = self.trimmer.find_byte_indices(bytes, n_runes);
let text: &str = unsafe { from_utf8_unchecked(&bytes[..end_byte_idx]) };
(end_byte_idx, self.trimmer.trim(text).parse::<bool>().ok())
}
}
impl Parser for BooleanParser {}
pub struct FloatParser {
trimmer: FloatTrimmer,
}
impl FloatParser {
pub fn new(alignment: Alignment, trim_symbol: Symbol) -> Self {
Self {
trimmer: FloatTrimmer::new(alignment, trim_symbol),
}
}
pub fn try_parse<T>(&self, bytes: &[u8], n_runes: usize) -> (usize, Option<T>)
where
T: FromStr,
{
let end_byte_idx: usize = self.trimmer.find_byte_indices(bytes, n_runes);
let text: &str = unsafe { from_utf8_unchecked(&bytes[..end_byte_idx]) };
(end_byte_idx, self.trimmer.trim(text).parse::<T>().ok())
}
}
impl Parser for FloatParser {}
pub struct IntParser {
trimmer: IntTrimmer,
}
impl IntParser {
pub fn new() -> Self {
Self {
trimmer: IntTrimmer::new(),
}
}
pub fn try_parse<T>(&self, bytes: &[u8], n_runes: usize) -> (usize, Option<T>)
where
T: atoi_simd::Parse + atoi_simd::ParseNeg,
{
let (start_byte_idx, end_byte_idx, n_bytes_in_column): (usize, usize, usize) =
self.trimmer.find_byte_indices(bytes, n_runes);
let value: Option<T> = atoi_simd::parse::<T>(&bytes[start_byte_idx..end_byte_idx]).ok();
(n_bytes_in_column, value)
}
}
impl Parser for IntParser {}
pub struct Utf8Parser {
trimmer: TextTrimmer,
}
impl Utf8Parser {
pub fn new(alignment: Alignment, trim_symbol: Symbol) -> Self {
Self {
trimmer: TextTrimmer::new(alignment, trim_symbol),
}
}
pub fn try_parse<'a>(&self, bytes: &'a [u8], n_runes: usize) -> (usize, Option<&'a str>) {
let end_byte_idx: usize = self.trimmer.find_byte_indices(bytes, n_runes);
let text: &'a str = unsafe { from_utf8_unchecked(&bytes[..end_byte_idx]) };
(end_byte_idx, Some(self.trimmer.trim(text)))
}
}
impl Parser for Utf8Parser {}