Carry source spans for error messages
This commit is contained in:
parent
1d80ab681e
commit
1170009b4f
6 changed files with 132 additions and 59 deletions
|
|
@ -1,6 +1,6 @@
|
|||
use chrono::NaiveDate;
|
||||
|
||||
use crate::files::commands::{self, DoneDate, Time};
|
||||
use crate::files::commands::{self, DoneDate, Spanned, Time};
|
||||
use crate::files::Source;
|
||||
|
||||
use super::delta::{Delta, DeltaStep};
|
||||
|
|
@ -29,7 +29,9 @@ impl From<&commands::DateSpec> for DateSpec {
|
|||
.map(|delta| delta.into())
|
||||
.unwrap_or_default();
|
||||
if let Some(time) = spec.end_time {
|
||||
end_delta.steps.push(DeltaStep::Time(time));
|
||||
end_delta
|
||||
.steps
|
||||
.push(Spanned::new(time.span, DeltaStep::Time(time.value)));
|
||||
}
|
||||
|
||||
let repeat: Option<Delta> = spec.repeat.as_ref().map(|repeat| (&repeat.delta).into());
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
use std::cmp::Ordering;
|
||||
|
||||
use crate::files::commands::{self, Time, Weekday};
|
||||
use crate::files::commands::{self, Spanned, Time, Weekday};
|
||||
|
||||
/// Like [`commands::DeltaStep`] but includes a new constructor,
|
||||
/// [`DeltaStep::Time`].
|
||||
|
|
@ -122,23 +122,27 @@ impl DeltaStep {
|
|||
|
||||
#[derive(Debug, Default)]
|
||||
pub struct Delta {
|
||||
pub steps: Vec<DeltaStep>,
|
||||
pub steps: Vec<Spanned<DeltaStep>>,
|
||||
}
|
||||
|
||||
impl From<&commands::Delta> for Delta {
|
||||
fn from(delta: &commands::Delta) -> Self {
|
||||
Self {
|
||||
steps: delta.0.iter().map(|&step| step.into()).collect(),
|
||||
steps: delta
|
||||
.0
|
||||
.iter()
|
||||
.map(|step| Spanned::new(step.span, step.value.into()))
|
||||
.collect(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Delta {
|
||||
pub fn lower_bound(&self) -> i32 {
|
||||
self.steps.iter().map(DeltaStep::lower_bound).sum()
|
||||
self.steps.iter().map(|step| step.value.lower_bound()).sum()
|
||||
}
|
||||
|
||||
pub fn upper_bound(&self) -> i32 {
|
||||
self.steps.iter().map(DeltaStep::upper_bound).sum()
|
||||
self.steps.iter().map(|step| step.value.upper_bound()).sum()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
use crate::files::commands::{self, DoneDate, Expr, Time, Var};
|
||||
use crate::files::commands::{self, DoneDate, Expr, Spanned, Time, Var};
|
||||
use crate::files::Source;
|
||||
|
||||
use super::delta::{Delta, DeltaStep};
|
||||
|
|
@ -28,7 +28,9 @@ impl From<&commands::FormulaSpec> for FormulaSpec {
|
|||
.map(|delta| delta.into())
|
||||
.unwrap_or_default();
|
||||
if let Some(time) = spec.end_time {
|
||||
end_delta.steps.push(DeltaStep::Time(time));
|
||||
end_delta
|
||||
.steps
|
||||
.push(Spanned::new(time.span, DeltaStep::Time(time.value)));
|
||||
}
|
||||
|
||||
Self {
|
||||
|
|
@ -49,15 +51,21 @@ impl From<&commands::WeekdaySpec> for FormulaSpec {
|
|||
|
||||
let mut end_delta = Delta::default();
|
||||
if let Some(wd) = spec.end {
|
||||
end_delta.steps.push(DeltaStep::Weekday(1, wd));
|
||||
end_delta
|
||||
.steps
|
||||
.push(Spanned::new(wd.span, DeltaStep::Weekday(1, wd.value)));
|
||||
}
|
||||
if let Some(delta) = &spec.end_delta {
|
||||
for step in &delta.0 {
|
||||
end_delta.steps.push((*step).into());
|
||||
end_delta
|
||||
.steps
|
||||
.push(Spanned::new(step.span, step.value.into()));
|
||||
}
|
||||
}
|
||||
if let Some(time) = spec.end_time {
|
||||
end_delta.steps.push(DeltaStep::Time(time));
|
||||
end_delta
|
||||
.steps
|
||||
.push(Spanned::new(time.span, DeltaStep::Time(time.value)));
|
||||
}
|
||||
|
||||
Self {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue