Skip to content

Commit

Permalink
Revamped TimestampBuilder
Browse files Browse the repository at this point in the history
  • Loading branch information
popematt committed Jun 28, 2023
1 parent 247ac34 commit 8f02c95
Show file tree
Hide file tree
Showing 3 changed files with 196 additions and 239 deletions.
14 changes: 7 additions & 7 deletions src/text/parsers/timestamp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use crate::text::parse_result::{
};
use crate::text::parsers::{stop_character, trim_zeros_and_parse_i32, trim_zeros_and_parse_u32};
use crate::text::text_value::TextValue;
use crate::types::{Decimal, FractionalSecondSetter, Timestamp};
use crate::types::{Decimal, Timestamp, TimestampBuilder, HasFractionalSeconds, HasSeconds};

/// Matches the text representation of a timestamp value and returns the resulting Timestamp
/// as a [TextValue::Timestamp].
Expand Down Expand Up @@ -142,16 +142,16 @@ fn timestamp_precision_ymd_hms_fractional(input: &str) -> IonParseResult<TextVal
/// Parses the fractional seconds and stores it in the [FractionalSecondSetter].
fn assign_fractional_seconds(
fractional_text: &str,
mut setter: FractionalSecondSetter,
) -> IonParseResult<FractionalSecondSetter> {
setter: TimestampBuilder<HasSeconds>,
) -> IonParseResult<TimestampBuilder<HasFractionalSeconds>> {
let number_of_digits = fractional_text.len();
// If the precision is less than or equal to nanoseconds...
if number_of_digits <= 9 {
let setter = if number_of_digits <= 9 {
// Convert the number to nanoseconds and make a note of its original precision.
let power = 9 - number_of_digits;
let (_, fractional) = trim_zeros_and_parse_u32(fractional_text, "fractional seconds")?;
let nanoseconds = fractional * 10u32.pow(power as u32);
setter = setter.with_nanoseconds_and_precision(nanoseconds, number_of_digits as u32);
setter.with_nanoseconds_and_precision(nanoseconds, number_of_digits as u32)
} else {
// Otherwise, the number's precision is great enough that we'll need to construct a Decimal
// to store it without loss of fidelity.
Expand All @@ -162,8 +162,8 @@ fn assign_fractional_seconds(
)?
.1;
let decimal = Decimal::new(coefficient, -(number_of_digits as i64));
setter = setter.with_fractional_seconds(decimal);
}
setter.with_fractional_seconds(decimal)
};
Ok(("", setter))
}

Expand Down
7 changes: 2 additions & 5 deletions src/types/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,8 @@ pub use sequence::Sequence;
pub use sexp::SExp;
pub use string::Str;
pub use symbol::Symbol;
pub use timestamp::{
DaySetter, FractionalSecondSetter, HourAndMinuteSetter, Mantissa, MonthSetter, Precision,
SecondSetter, Timestamp,
};

pub use timestamp::{ Mantissa, Precision, Timestamp, TimestampBuilder };
pub(crate) use timestamp::{ HasSeconds, HasFractionalSeconds };
use crate::ion_data::IonOrd;
use std::cmp::Ordering;
use std::fmt;
Expand Down
Loading

0 comments on commit 8f02c95

Please sign in to comment.