Compare start/end time.
This commit is contained in:
parent
9846cde2f0
commit
890cd3e4fd
@ -43,6 +43,7 @@ use crate::types::GetStandardProperties;
|
||||
use crate::types::GreaterBlock;
|
||||
use crate::types::Heading;
|
||||
use crate::types::HorizontalRule;
|
||||
use crate::types::Hour;
|
||||
use crate::types::HourInner;
|
||||
use crate::types::InlineBabelCall;
|
||||
use crate::types::InlineSourceBlock;
|
||||
@ -51,6 +52,7 @@ use crate::types::Keyword;
|
||||
use crate::types::LatexEnvironment;
|
||||
use crate::types::LatexFragment;
|
||||
use crate::types::LineBreak;
|
||||
use crate::types::Minute;
|
||||
use crate::types::MinuteInner;
|
||||
use crate::types::Month;
|
||||
use crate::types::MonthInner;
|
||||
@ -81,6 +83,7 @@ use crate::types::Table;
|
||||
use crate::types::TableCell;
|
||||
use crate::types::TableRow;
|
||||
use crate::types::Target;
|
||||
use crate::types::Time;
|
||||
use crate::types::Timestamp;
|
||||
use crate::types::TimestampRangeType;
|
||||
use crate::types::TimestampType;
|
||||
@ -2247,6 +2250,58 @@ fn compare_timestamp<'b, 's>(
|
||||
// Compare time start
|
||||
let hour_start: Option<HourInner> = get_property_numeric(emacs, ":hour-start")?;
|
||||
let minute_start: Option<MinuteInner> = get_property_numeric(emacs, ":minute-start")?;
|
||||
let rust_hour_start = rust
|
||||
.start_time
|
||||
.as_ref()
|
||||
.map(Time::get_hour)
|
||||
.map(Hour::get_value);
|
||||
let rust_minute_start = rust
|
||||
.start_time
|
||||
.as_ref()
|
||||
.map(Time::get_minute)
|
||||
.map(Minute::get_value);
|
||||
if hour_start != rust_hour_start {
|
||||
this_status = DiffStatus::Bad;
|
||||
message = Some(format!(
|
||||
"hour start mismatch (emacs != rust) {:?} != {:?}",
|
||||
hour_start, rust_hour_start
|
||||
));
|
||||
}
|
||||
if minute_start != rust_minute_start {
|
||||
this_status = DiffStatus::Bad;
|
||||
message = Some(format!(
|
||||
"minute start mismatch (emacs != rust) {:?} != {:?}",
|
||||
minute_start, rust_minute_start
|
||||
));
|
||||
}
|
||||
|
||||
// Compare time end
|
||||
let hour_end: Option<HourInner> = get_property_numeric(emacs, ":hour-end")?;
|
||||
let minute_end: Option<MinuteInner> = get_property_numeric(emacs, ":minute-end")?;
|
||||
let rust_hour_end = rust
|
||||
.end_time
|
||||
.as_ref()
|
||||
.map(Time::get_hour)
|
||||
.map(Hour::get_value);
|
||||
let rust_minute_end = rust
|
||||
.end_time
|
||||
.as_ref()
|
||||
.map(Time::get_minute)
|
||||
.map(Minute::get_value);
|
||||
if hour_end != rust_hour_end {
|
||||
this_status = DiffStatus::Bad;
|
||||
message = Some(format!(
|
||||
"hour end mismatch (emacs != rust) {:?} != {:?}",
|
||||
hour_end, rust_hour_end
|
||||
));
|
||||
}
|
||||
if minute_end != rust_minute_end {
|
||||
this_status = DiffStatus::Bad;
|
||||
message = Some(format!(
|
||||
"minute end mismatch (emacs != rust) {:?} != {:?}",
|
||||
minute_end, rust_minute_end
|
||||
));
|
||||
}
|
||||
|
||||
// TODO: Compare :hour-start :minute-start :hour-end :minute-end :repeater-type :repeater-value :repeater-unit :warning-type :warning-value :warning-unit
|
||||
//
|
||||
|
@ -23,7 +23,10 @@ use crate::error::Res;
|
||||
use crate::parser::util::get_consumed;
|
||||
use crate::types::Date;
|
||||
use crate::types::DayOfMonth;
|
||||
use crate::types::Hour;
|
||||
use crate::types::Minute;
|
||||
use crate::types::Month;
|
||||
use crate::types::Time;
|
||||
use crate::types::Timestamp;
|
||||
use crate::types::TimestampRangeType;
|
||||
use crate::types::TimestampType;
|
||||
@ -67,6 +70,8 @@ fn diary_timestamp<'b, 'g, 'r, 's>(
|
||||
range_type: TimestampRangeType::None,
|
||||
start: None,
|
||||
end: None,
|
||||
start_time: None, // TODO
|
||||
end_time: None, // TODO
|
||||
},
|
||||
))
|
||||
}
|
||||
@ -113,7 +118,7 @@ fn active_timestamp<'b, 'g, 'r, 's>(
|
||||
exit_matcher: &active_time_rest_end,
|
||||
});
|
||||
let time_context = context.with_additional_node(&time_context);
|
||||
let (remaining, _time) =
|
||||
let (remaining, time) =
|
||||
opt(tuple((space1, parser_with_context!(time)(&time_context))))(remaining)?;
|
||||
let (remaining, _repeater) =
|
||||
opt(tuple((space1, parser_with_context!(repeater)(context))))(remaining)?;
|
||||
@ -135,6 +140,8 @@ fn active_timestamp<'b, 'g, 'r, 's>(
|
||||
range_type: TimestampRangeType::None,
|
||||
start: Some(start.clone()),
|
||||
end: Some(start),
|
||||
start_time: time.as_ref().map(|(_, time)| time.clone()),
|
||||
end_time: time.map(|(_, time)| time),
|
||||
},
|
||||
))
|
||||
}
|
||||
@ -151,7 +158,7 @@ fn inactive_timestamp<'b, 'g, 'r, 's>(
|
||||
exit_matcher: &inactive_time_rest_end,
|
||||
});
|
||||
let time_context = context.with_additional_node(&time_context);
|
||||
let (remaining, _time) =
|
||||
let (remaining, time) =
|
||||
opt(tuple((space1, parser_with_context!(time)(&time_context))))(remaining)?;
|
||||
let (remaining, _repeater) =
|
||||
opt(tuple((space1, parser_with_context!(repeater)(context))))(remaining)?;
|
||||
@ -173,6 +180,8 @@ fn inactive_timestamp<'b, 'g, 'r, 's>(
|
||||
range_type: TimestampRangeType::None,
|
||||
start: Some(start.clone()),
|
||||
end: Some(start),
|
||||
start_time: time.as_ref().map(|(_, time)| time.clone()),
|
||||
end_time: time.map(|(_, time)| time),
|
||||
},
|
||||
))
|
||||
}
|
||||
@ -199,6 +208,8 @@ fn active_date_range_timestamp<'b, 'g, 'r, 's>(
|
||||
range_type: TimestampRangeType::DateRange,
|
||||
start: first_timestamp.start,
|
||||
end: second_timestamp.end,
|
||||
start_time: first_timestamp.start_time,
|
||||
end_time: second_timestamp.end_time,
|
||||
},
|
||||
))
|
||||
}
|
||||
@ -220,10 +231,10 @@ fn active_time_range_timestamp<'b, 'g, 'r, 's>(
|
||||
exit_matcher: &time_range_rest_end,
|
||||
});
|
||||
let first_time_context = time_context.with_additional_node(&first_time_context);
|
||||
let (remaining, _first_time) =
|
||||
let (remaining, (_, first_time)) =
|
||||
tuple((space1, parser_with_context!(time)(&first_time_context)))(remaining)?;
|
||||
let (remaining, _) = tag("-")(remaining)?;
|
||||
let (remaining, _second_time) = parser_with_context!(time)(&time_context)(remaining)?;
|
||||
let (remaining, second_time) = parser_with_context!(time)(&time_context)(remaining)?;
|
||||
let (remaining, _repeater) =
|
||||
opt(tuple((space1, parser_with_context!(repeater)(context))))(remaining)?;
|
||||
let (remaining, _warning_delay) = opt(tuple((
|
||||
@ -244,6 +255,8 @@ fn active_time_range_timestamp<'b, 'g, 'r, 's>(
|
||||
range_type: TimestampRangeType::None,
|
||||
start: Some(start_date.clone()),
|
||||
end: Some(start_date),
|
||||
start_time: Some(first_time),
|
||||
end_time: Some(second_time),
|
||||
},
|
||||
))
|
||||
}
|
||||
@ -271,6 +284,8 @@ fn inactive_date_range_timestamp<'b, 'g, 'r, 's>(
|
||||
range_type: TimestampRangeType::DateRange,
|
||||
start: first_timestamp.start,
|
||||
end: second_timestamp.end,
|
||||
start_time: first_timestamp.start_time,
|
||||
end_time: second_timestamp.end_time,
|
||||
},
|
||||
))
|
||||
}
|
||||
@ -292,10 +307,10 @@ fn inactive_time_range_timestamp<'b, 'g, 'r, 's>(
|
||||
exit_matcher: &time_range_rest_end,
|
||||
});
|
||||
let first_time_context = time_context.with_additional_node(&first_time_context);
|
||||
let (remaining, _first_time) =
|
||||
let (remaining, (_, first_time)) =
|
||||
tuple((space1, parser_with_context!(time)(&first_time_context)))(remaining)?;
|
||||
let (remaining, _) = tag("-")(remaining)?;
|
||||
let (remaining, _second_time) = parser_with_context!(time)(&time_context)(remaining)?;
|
||||
let (remaining, second_time) = parser_with_context!(time)(&time_context)(remaining)?;
|
||||
let (remaining, _repeater) =
|
||||
opt(tuple((space1, parser_with_context!(repeater)(context))))(remaining)?;
|
||||
let (remaining, _warning_delay) = opt(tuple((
|
||||
@ -316,6 +331,8 @@ fn inactive_time_range_timestamp<'b, 'g, 'r, 's>(
|
||||
range_type: TimestampRangeType::None,
|
||||
start: Some(start_date.clone()),
|
||||
end: Some(start_date),
|
||||
start_time: Some(first_time),
|
||||
end_time: Some(second_time),
|
||||
},
|
||||
))
|
||||
}
|
||||
@ -389,16 +406,23 @@ fn dayname_end<'b, 'g, 'r, 's>(
|
||||
fn time<'b, 'g, 'r, 's>(
|
||||
context: RefContext<'b, 'g, 'r, 's>,
|
||||
input: OrgSource<'s>,
|
||||
) -> Res<OrgSource<'s>, OrgSource<'s>> {
|
||||
let (remaining, _hour) = verify(digit1, |hour: &OrgSource<'_>| {
|
||||
) -> Res<OrgSource<'s>, Time<'s>> {
|
||||
let (remaining, hour) = verify(digit1, |hour: &OrgSource<'_>| {
|
||||
hour.len() >= 1 && hour.len() <= 2
|
||||
})(input)?;
|
||||
let (remaining, _) = tag(":")(remaining)?;
|
||||
let (remaining, _minute) =
|
||||
let (remaining, minute) =
|
||||
verify(digit1, |minute: &OrgSource<'_>| minute.len() == 2)(remaining)?;
|
||||
let (remaining, _time_rest) = opt(parser_with_context!(time_rest)(context))(remaining)?;
|
||||
let source = get_consumed(input, remaining);
|
||||
Ok((remaining, source))
|
||||
|
||||
let hour = Hour::new(Into::<&str>::into(hour))
|
||||
.expect("TODO: I should be able to return CustomError from nom parsers.");
|
||||
let minute = Minute::new(Into::<&str>::into(minute))
|
||||
.expect("TODO: I should be able to return CustomError from nom parsers.");
|
||||
let time = Time::new(hour, minute, _time_rest.map(Into::<&str>::into))
|
||||
.expect("TODO: I should be able to return CustomError from nom parsers.");
|
||||
|
||||
Ok((remaining, time))
|
||||
}
|
||||
|
||||
#[cfg_attr(feature = "tracing", tracing::instrument(ret, level = "debug"))]
|
||||
|
@ -189,6 +189,8 @@ pub struct Timestamp<'s> {
|
||||
pub range_type: TimestampRangeType,
|
||||
pub start: Option<Date<'s>>,
|
||||
pub end: Option<Date<'s>>,
|
||||
pub start_time: Option<Time<'s>>,
|
||||
pub end_time: Option<Time<'s>>,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
@ -273,7 +275,7 @@ impl Hour {
|
||||
// TODO: Make a real error type instead of a boxed any error.
|
||||
pub fn new<'s>(source: &'s str) -> Result<Self, Box<dyn std::error::Error>> {
|
||||
let hour = source.parse::<HourInner>()?;
|
||||
if hour < 1 || hour > 23 {
|
||||
if hour > 23 {
|
||||
Err("Hour exceeds possible range.")?;
|
||||
}
|
||||
Ok(Hour(hour))
|
||||
@ -288,7 +290,7 @@ impl Minute {
|
||||
// TODO: Make a real error type instead of a boxed any error.
|
||||
pub fn new<'s>(source: &'s str) -> Result<Self, Box<dyn std::error::Error>> {
|
||||
let minute = source.parse::<MinuteInner>()?;
|
||||
if minute < 1 || minute > 59 {
|
||||
if minute > 59 {
|
||||
Err("Minute exceeds possible range.")?;
|
||||
}
|
||||
Ok(Minute(minute))
|
||||
|
Loading…
Reference in New Issue
Block a user