PreviewOptions#

Options passed to Project::preview. PreviewOptions::default() previews the whole project with no analytics, no reasons, no baseline check and no load profile. Set individual fields with struct update syntax.

Declaration#

#[derive(Clone, Debug, Default)]
pub struct PreviewOptions {
    pub subtree: Option<Subtree>,
    pub analytics: AnalyticsOptions,
    pub reasons: bool,
    pub baseline_id: Option<String>,
    pub profile: Option<ProfileQuery>,
}

Fields#

Field Type Default Description
subtree Option<Subtree> None Limits scheduling to one task's subtree and what depends on it. None schedules the whole project.
analytics AnalyticsOptions nothing requested Analytics to compute for the previewed dates. Fills the result's analytics field.
reasons bool false true sets reason on each Mutation in the result's updates.
baseline_id Option<String> None Expected baseline token. Some makes the call fail with ProjectError::StaleBaseline unless it names the current baseline. Take it from the latest ScheduleResult's baseline_id.
profile Option<ProfileQuery> None Some fills the result's profile with a LoadProfile of the previewed dates. An invalid query makes the call fail with Error::Input.

PreviewOptions has the same subtree, analytics and reasons fields as SolveOptions, but no include_unchanged: preview results are always sparse.

Example#

use plen_core::{
    DateTime, Patch, PreviewOptions, Project, ProjectData, SchedulingChanges, SolveOptions,
    TaskData, TaskUpdate,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let day = |d| DateTime::from_ymd_hm(2026, 1, d, 0, 0).ok_or("invalid date");

    let mut task = TaskData::new("a");
    task.start_date = Some(day(1)?);
    task.duration = Some(2.0);

    let mut project = Project::default();
    let solved = project.solve(
        Some(ProjectData { tasks: vec![task], ..Default::default() }),
        &SolveOptions::default(),
    )?;

    let mut update = TaskUpdate::new("a");
    update.start_date = Patch::Value(day(5)?);
    let mut changes = SchedulingChanges::default();
    changes.tasks.update.push(update);

    let options = PreviewOptions {
        reasons: true,
        baseline_id: solved.baseline_id.clone(),
        ..Default::default()
    };
    let preview = project.preview(&changes, &options)?;
    for m in &preview.updates {
        println!("{:?}: {:?} ({:?})", m.id, m.start_date, m.reason);
    }
    Ok(())
}