> For the complete documentation index, see [llms.txt](https://cristiandis.gitbook.io/ntix/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cristiandis.gitbook.io/ntix/ntix-documentation/docs-it/api/diff.md).

# DiffEngine

## DiffEngine

Calcola la differenza tra lo stato desiderato (config) e lo stato attuale.

```rust
use ntix_rs::diff::diff_engine;
```

### compute\_diff

```rust
#[allow(clippy::too_many_arguments)]
pub async fn compute_diff(
    config: &NTIXConfig,
    state: &State,
    winget_installed: Option<bool>,
    choco_installed: Option<bool>,
    scoop_installed: Option<bool>,
    runner: Option<&dyn CommandRunner>,
    adopt_mode: bool,
    upgrade_mode: bool,
    validate_packages: bool,
    installed: Option<&InstalledPackages>,
    progress: &ProgressBar,
) -> Result<DiffResult, Box<dyn Error>>
```

| Parametro           | Tipo                         | Predefinito  | Descrizione                                                                    |
| ------------------- | ---------------------------- | ------------ | ------------------------------------------------------------------------------ |
| `config`            | `&NTIXConfig`                | obbligatorio | Stato desiderato dei pacchetti                                                 |
| `state`             | `&State`                     | obbligatorio | Stato attuale tracciato                                                        |
| `winget_installed`  | `Option<bool>`               | `None`       | Sovrascrive la disponibilità di winget; rilevata automaticamente se `None`     |
| `choco_installed`   | `Option<bool>`               | `None`       | Sovrascrive la disponibilità di Chocolatey; rilevata automaticamente se `None` |
| `scoop_installed`   | `Option<bool>`               | `None`       | Sovrascrive la disponibilità di Scoop; rilevata automaticamente se `None`      |
| `runner`            | `Option<&dyn CommandRunner>` | `None`       | Command runner iniettato; usa `ProcessCommandRunner` se `None`                 |
| `adopt_mode`        | `bool`                       | `false`      | Adotta nello stato i pacchetti installati esternamente                         |
| `upgrade_mode`      | `bool`                       | `false`      | Controlla gli aggiornamenti disponibili                                        |
| `validate_packages` | `bool`                       | `true`       | Convalida l'esistenza dei pacchetti nei repository remoti                      |
| `installed`         | `Option<&InstalledPackages>` | `None`       | Pacchetti installati precaricati; rilevati automaticamente se `None`           |
| `progress`          | `&ProgressBar`               | obbligatorio | Reporter dei messaggi di stato (uno spinner di indicatif)                      |

**Restituisce:** `Result<DiffResult, Box<dyn Error>>`

### Flusso di esecuzione

1. Esegue un singolo passaggio di rilevamento delle capacità del gestore (`package_manager_detector::validate_managers_async`); il risultato `ValidationResult` viene memorizzato nel diff e i relativi avvisi vengono copiati
2. Rileva i pacchetti installati (se `installed` è `None`)
3. Recupera i pacchetti aggiornabili per ogni origine abilitata che ha voci non bloccate (solo in `upgrade_mode`)
4. Classifica ogni pacchetto dichiarato in `to_install`, `to_upgrade`, `to_skip`, oppure `to_adopt`
5. Raccoglie `to_untracked` (pacchetti installati che NTIX non tiene traccia)
6. Convalida l'esistenza dei pacchetti: i pacchetti confermati come inesistenti vengono rimossi da `to_install` con un `Pacchetto non trovato` avviso; i pacchetti che non possono essere verificati vengono mantenuti con un `Impossibile verificare` avviso (saltato quando `validate_packages` è `false`)
7. Trova gli orfani (presenti nello stato ma non nella configurazione) e li sposta in `to_remove`
8. Calcola le aggiunte e le rimozioni dei bucket di scoop (solo quando scoop è abilitato)

La classificazione del file di configurazione (`config_files_to_create` / `config_files_to_update` / `config_files_no_longer_managed`) **non** fa parte di `compute_diff`. Usa il separato `compute_config_files_diff(result, config, state)` helper quando il chiamante ha scelto con `-c`.

Nota: il rilevamento degli orfani, il rilevamento degli aggiornamenti e il diff dei bucket vengono eseguiti solo per i gestori abilitati e confermati installati.
