> 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/models.md).

# Modelli

## Modelli

Tipi di dati in `ntix_rs::models`.

### PackageEntry

Una dichiarazione di pacchetto dal file di configurazione.

```rust
pub struct PackageEntry {
    pub id: String,
    pub version: Option<String>,
}

impl PackageEntry {
    pub fn new(id: impl Into<String>) -> Self;
}
```

| Campo     | Tipo             | Predefinito  | Descrizione                        |
| --------- | ---------------- | ------------ | ---------------------------------- |
| `id`      | `String`         | obbligatorio | Identificatore del pacchetto       |
| `version` | `Option<String>` | `None`       | Versione bloccata; `None` = latest |

### PackageSpec

Un pacchetto risolto con il relativo gestore di origine.

```rust
pub struct PackageSpec {
    pub id: String,
    pub version: Option<String>,
    pub source: PackageManager,
}
```

| Campo     | Tipo             | Descrizione                             |
| --------- | ---------------- | --------------------------------------- |
| `id`      | `String`         | Identificatore del pacchetto            |
| `version` | `Option<String>` | Versione risolta (None se non bloccata) |
| `source`  | `PackageManager` | `Winget`, `Chocolatey`, oppure `Scoop`  |

### UpgradeInfo

Informazioni sulla versione per un aggiornamento disponibile. Definito in `models::installed_packages`.

```rust
pub struct UpgradeInfo {
    pub current_version: String,
    pub available_version: String,
}

impl UpgradeInfo {
    pub fn new(current_version: impl Into<String>, available_version: impl Into<String>) -> Self;
}
```

### InstalledPackages

Pacchetti attualmente installati sul sistema. Definito in `models::installed_packages`.

```rust
pub struct InstalledPackages {
    pub winget: HashMap<String, String>,
    pub chocolatey: HashMap<String, String>,
    pub scoop: HashMap<String, String>,
}
```

Ogni mappa associa l'ID del pacchetto alla stringa della versione installata.

### State

Lo stato dei pacchetti tracciati da NTIX.

```rust
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct State {
    pub version: i32,
    pub winget: HashMap<String, String>,
    pub chocolatey: HashMap<String, String>,
    pub scoop: HashMap<String, String>,
    pub scoop_buckets: HashMap<String, Option<String>>,
    pub config_files: HashMap<String, String>,
}
```

| Campo           | Tipo                              | Predefinito | Descrizione                                                                               |
| --------------- | --------------------------------- | ----------- | ----------------------------------------------------------------------------------------- |
| `version`       | `i32`                             | `2`         | Versione del formato del file di stato                                                    |
| `winget`        | `HashMap<String, String>`         | vuoto       | Pacchetti winget tracciati                                                                |
| `chocolatey`    | `HashMap<String, String>`         | vuoto       | Pacchetti chocolatey tracciati                                                            |
| `scoop`         | `HashMap<String, String>`         | vuoto       | Pacchetti scoop tracciati                                                                 |
| `scoop_buckets` | `HashMap<String, Option<String>>` | vuoto       | Bucket Scoop aggiunti da NTIX (nome a URL)                                                |
| `config_files`  | `HashMap<String, String>`         | vuoto       | File di configurazione gestiti (percorso assoluto di destinazione all'hash del contenuto) |

### DiffResult

L'insieme di azioni calcolato da applicare.

```rust
pub struct DiffResult {
    pub to_install: Vec<PackageSpec>,
    pub to_upgrade: Vec<PackageSpec>,
    pub to_skip: Vec<PackageSpec>,
    pub to_remove: Vec<PackageSpec>,
    pub to_adopt: Vec<PackageSpec>,
    pub to_untracked: Vec<PackageSpec>,
    pub buckets_to_add: Vec<ScoopBucket>,
    pub buckets_to_remove: Vec<ScoopBucket>,
    pub config_files_to_create: Vec<ConfigFileEntry>,
    pub config_files_to_update: Vec<ConfigFileEntry>,
    pub config_files_no_longer_managed: Vec<String>,
    pub warnings: Vec<String>,
    pub manager_validation: ValidationResult,
}

impl DiffResult {
    pub fn is_empty(&self) -> bool;
}
```

| Campo                            | Tipo                   | Descrizione                                                                    |
| -------------------------------- | ---------------------- | ------------------------------------------------------------------------------ |
| `to_install`                     | `Vec<PackageSpec>`     | Pacchetti da installare                                                        |
| `to_upgrade`                     | `Vec<PackageSpec>`     | Pacchetti da aggiornare (solo con `--upgrade`)                                 |
| `to_skip`                        | `Vec<PackageSpec>`     | Pacchetti già nello stato desiderato                                           |
| `to_remove`                      | `Vec<PackageSpec>`     | Pacchetti orfani da rimuovere                                                  |
| `to_adopt`                       | `Vec<PackageSpec>`     | Pacchetti installati esternamente da adottare nello stato                      |
| `to_untracked`                   | `Vec<PackageSpec>`     | Pacchetti installati non tracciati nello stato (solo informativo)              |
| `buckets_to_add`                 | `Vec<ScoopBucket>`     | Bucket Scoop da aggiungere                                                     |
| `buckets_to_remove`              | `Vec<ScoopBucket>`     | Bucket Scoop tracciati da NTIX ma non più configurati                          |
| `config_files_to_create`         | `Vec<ConfigFileEntry>` | File da creare su disco                                                        |
| `config_files_to_update`         | `Vec<ConfigFileEntry>` | File il cui contenuto sorgente è cambiato                                      |
| `config_files_no_longer_managed` | `Vec<String>`          | Percorsi di destinazione tracciati nello stato ma non più nella configurazione |
| `warnings`                       | `Vec<String>`          | Avvisi non fatali                                                              |
| `manager_validation`             | `ValidationResult`     | Risultato della fase di rilevamento delle capacità                             |
| `is_empty()`                     | `bool`                 | Vero se tutte le liste di azioni sono vuote (avvisi esclusi)                   |

### ConfigFileEntry

Un file arbitrario gestito da NTIX, copiato da `src` a `dest`. Entrambi i percorsi vengono risolti in percorsi assoluti al momento del caricamento della configurazione.

```rust
pub struct ConfigFileEntry {
    pub dest: PathBuf,
    pub src: PathBuf,
}
```

| Campo  | Tipo      | Descrizione                                                                                 |
| ------ | --------- | ------------------------------------------------------------------------------------------- |
| `dest` | `PathBuf` | Percorso assoluto di destinazione                                                           |
| `src`  | `PathBuf` | Percorso assoluto di origine (risolto a partire dalla directory del file di configurazione) |

### ValidationResult

Risultato del singolo controllo di compatibilità del gestore di pacchetti condiviso da `diff` e `apply`.

```rust
pub struct ValidationResult {
    pub warnings: Vec<String>,
    pub winget_installed: bool,
    pub choco_installed: bool,
    pub scoop_installed: bool,
}
```

### ImportNode

Tiene traccia dell'albero di importazione prodotto durante l'analisi della configurazione.

```rust
pub struct ImportNode {
    pub path: PathBuf,
    pub children: Vec<ImportNode>,
}
```

### NTIXConfig

La configurazione completamente analizzata.

```rust
pub struct NTIXConfig {
    pub options: NTIXOptions,
    pub winget_packages: Vec<PackageEntry>,
    pub choco_packages: Vec<PackageEntry>,
    pub scoop_packages: Vec<PackageEntry>,
    pub config_files: Vec<ConfigFileEntry>,
    pub imports: Vec<ImportNode>,
}
```
