[Canonical page](<https://docs.dhtmlx.com/planning-engine/rust/api/core/changes/applied-operation/>)
[Full documentation index](<https://docs.dhtmlx.com/planning-engine/llms.txt>)


# AppliedOperation

One operation of a [`SchedulingChanges`](<https://docs.dhtmlx.com/planning-engine/rust/api/core/changes/scheduling-changes.md>) set that [`Project::apply`](<https://docs.dhtmlx.com/planning-engine/rust/api/core/project/project.md#apply>) accepted. You don't build it yourself. Read it from [`ApplyReport::applied`](<https://docs.dhtmlx.com/planning-engine/rust/api/core/changes/apply-report.md#applied>).

## Declaration

```rust
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct AppliedOperation {
    pub path: String,
}
```

With the `serde` feature, it also implements `Serialize` and `Deserialize`.

## Fields

| Name | Type | Description |
|---|---|---|
| `path` | `String` | The accepted operation, written as `{group}.{list}[{index}]`. `group` is `tasks`, `links`, `resources` or `assignments`. `list` is `add`, `update` or `remove`. `index` is the entry's position in that list of the change set. Examples: `tasks.update[0]`, `links.add[2]`. |

## Serialization

With the `serde` feature, an `AppliedOperation` serializes as:

```json
{ "path": "tasks.update[0]" }
```

## Example

Update a task's duration and print the paths of the accepted operations.

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

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let monday = DateTime::from_ymd_hm(2026, 3, 2, 8, 0).ok_or("invalid date")?;

    let mut design = TaskData::new(1);
    design.start_date = Some(monday);
    design.duration = Some(2.0);

    let data = ProjectData {
        tasks: vec![design],
        ..Default::default()
    };

    let mut project = Project::default();
    project.solve(Some(data), &SolveOptions::default())?;

    let mut changes = SchedulingChanges::default();
    let mut update = TaskUpdate::new(1);
    update.duration = Patch::Value(3.0);
    changes.tasks.update.push(update);

    let report = project.apply(&changes)?;
    for applied in &report.applied {
        println!("applied: {}", applied.path); // applied: tasks.update[0]
    }
    Ok(())
}
```

## Related

- [`ApplyReport`](<https://docs.dhtmlx.com/planning-engine/rust/api/core/changes/apply-report.md>) - lists these in `applied`
- [`RejectedOperation`](<https://docs.dhtmlx.com/planning-engine/rust/api/core/changes/rejected-operation.md>) - the counterpart for operations that were refused
- [`SchedulingChanges`](<https://docs.dhtmlx.com/planning-engine/rust/api/core/changes/scheduling-changes.md#operation-order>) - the order the operations in `path` run in
- [Data Updates](<https://docs.dhtmlx.com/planning-engine/rust/live-projects/editing-a-project.md>) - shows how to apply a change set and read the report
