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

# ConfigLoader

## ConfigLoader

Analizza i file di configurazione Lua in `NTIXConfig` strutture.

```rust
use ntix_rs::config::config_loader;
```

### Elementi

| Elemento                | Firma                                                                                               | Descrizione                                                                        |
| ----------------------- | --------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| `DEFAULT_CONFIG_PATH`   | `LazyLock<PathBuf>`                                                                                 | `~/ntix/config.lua`                                                                |
| `ensure_default_config` | `fn ensure_default_config(config_path: Option<PathBuf>) -> PathBuf`                                 | Crea la configurazione predefinita se mancante e restituisce il percorso risolto   |
| `load`                  | `fn load(config_path: PathBuf) -> Result<NTIXConfig, Box<dyn Error>>`                               | Carica e analizza un file di configurazione Lua dal disco                          |
| `load_from_string`      | `fn load_from_string(lua_script: &str, config_path: PathBuf) -> Result<NTIXConfig, Box<dyn Error>>` | Analizza una stringa di script Lua, risolvendo gli import relativi a `config_path` |

### Contratto di configurazione Lua

Lo script deve restituire una tabella con `options` e `pkgs` chiavi:

```lua
return {
    options = {
        winget = { enable = true, acceptAgreements = true },
        chocolatey = { enable = true, yes = true },
        scoop = { enable = true }
    },
    pkgs = {
        winget = { "Google.Chrome", { id = "7zip.7zip", version = "23.01" } },
        chocolatey = { "ripgrep" },
        scoop = { "fd", "bat" }
    }
}
```

### Contratto dei file di configurazione

Una `configFiles` tabella facoltativa dichiara file arbitrari da gestire. Le chiavi sono percorsi di destinazione assoluti; i valori sono percorsi sorgente risolti rispetto alla directory del file di configurazione.

```lua
return {
    options = {},
    pkgs = {},
    configFiles = {
        ["C:/Users/you/AppData/Roaming/kitty/kitty.conf"] = "configs/kitty.conf"
    }
}
```

| Regola       | Comportamento                                                                                                                                   |
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| Destinazione | Deve essere un percorso assoluto; usa `/` (Lua considera `\` come una sequenza di escape). Una destinazione relativa è un errore di caricamento |
| Sorgente     | Risolta rispetto alla directory del file di configurazione; deve esistere al momento del caricamento (altrimenti errore di caricamento)         |

### Funzione Lua integrata: import()

```lua
import("shared/packages.lua")
import({ "./base.lua", "../../packages/scoop.lua" })
```

`import()` accetta una singola stringa di percorso oppure un array di stringhe di percorso. I percorsi vengono risolti rispetto al file che esegue l'importazione. Le chiamate nidificate `import()` funzionano mentre viene eseguito uno script importato. Gli array di pacchetti vengono deduplicati per ID (vince l'ultimo); le tabelle delle opzioni vengono unite in profondità; `configFiles` le mappe vengono unite allo stesso modo.

### Errori

* File di configurazione non trovato
* Errore di sintassi o di runtime Lua
* `return` valore che non è una tabella
* Manca il `options` o `pkgs` livello superiore della
* File di importazione non trovato (richiamato dalla configurazione)
* `configFiles` destinazione non assoluta, oppure file sorgente mancante
