# Index
- [Español](https://gitlab.com/public-sources1/validate_directory_structure/-/blob/main/docs/readme_es.md)
- [English](https://gitlab.com/public-sources1/validate_directory_structure/-/blob/main/readme.md)
# Validador de Estructura de Directorios
Herramienta para validar estructuras de directorios contra un esquema JSON.
Verifica **carpetas** y **archivos** requeridos.
### Características
- Valida estructuras anidadas
- Verifica archivos obligatorios/opcionales
- Soporta validación de extensiones
- Reporte detallado de errores
### Ejemplo de estructura JSON
```JSON
{
"name": "Prueba",
"description": "Estructurea de directorio, archivos y carpetas requeridos u opcionales",
"folders": [
{
"required": true,
"names": ["forest", "trees field"],
"files": [
{
"required": true,
"names": ["mountain", "hill"]
}
],
"folders": [
{
"names": ["sub_forest", "sub forest"],
"required": true,
"files": [
{
"names": ["file_sub_forest", "sub forest"],
"required": true
},
{
"names": ["file_optinal"],
"required": false
}
]
}
]
},
{
"required": false,
"names": ["rivers"],
"files": [
{
"required": true,
"names": ["aaaa", "bbbbb"]
}
]
}
]
}
```
## Tipado relevante
```rust
#[derive(Debug, Serialize)]
pub enum ItemType {
File,
Folder,
}
#[derive(Debug, Serialize)]
pub enum AlertType {
Warning, // --> Works only for property "required" false in JSON
MissingItem,
ExtraItem,
ErrorReadingFile,
}
#[derive(Debug, Serialize)]
pub struct AlertFileStructure {
pub path: String,
pub item_type: ItemType,
pub alert_type: AlertType,
}
```
### Uso:
```toml
# Cargo.toml
[dependencies]
validate_directory_structure = "0.2.4"
```
```rust
use validate_directory_structure::ValidateDirTree;
let validate_structure = ValidateDirTree {
required_extensions: vec!["html", "css", "js"], // extensions of files mandatory
valid_extensions: vec!["ts", "tsx"], // These extensions aren't mandatory on folder
};
let results = validate_structure.validate_structure("/your/folder/path", YOUR_JSON_STRUCTUEE);
println!("these are the results: {:?}", results);
```
### Direct my_project_example
```
/ my_project_example
├── trees field 🗹
│ ├── mountain.html 🗹
│ ├── mountain.js 🗹
│ ├── mountain.css 🗹
│ ├── main.js 🗷 // no definido en la estructura JSON
│ └── sub_forest 🗹
│ ├── file_optinal.html 🗹
│ ├── file_optinal.js 🗹
│ ├── file_optinal.css 🗹
│ └── file_optinal.lock 🗷 // no definido en la estructura JSON
│ └── file_optinal.ts 🗹
└── ocean 🗷 // no definido en la estructura JSON
├── pacific.html 🗷 // Solo muestra error en la carpeta padre
└── pacific.js 🗷 // Solo muestra error en la carpeta padre
```
### Sample Output `Vec<AlertFileStructure>`
Lista de errores
- **ResultValidationTypes**:
- Error - > File "/trees field/main.js" es un **ExtraFile** porque no fue
definido en la estructura JSON
- Error - > File "/trees field/sub_forest/file_sub_forest.js" es un
**MissingFile** porque fue definido en el JSON
- Error - > File "/trees field/sub_forest/file_sub_forest.css" es un
**MissingFile** porque fue definido en el JSON
- Error - > File "/trees field/sub_forest/file_sub_forest.html" es un
**MissingFile** porque fue definido en el JSON
- Error - > File "/trees field/sub_forest/file_optinal.lock" es un **ExtraFile**
porque no fue defino en el JSON
- Warning - > Folder "/rivers" fue definido pero no es obligatorio que exista
**ExtraFile**
- Error - > Folder "/ocean" es un **ExtraFile** porque no fue definido en el
JSON
- **list_of_files_found**:
```Rust
{
"id_area_estudio-id_poligono_base": "/home/sonickseven/www/anla-validator/geoEjemeplo/estudio_ambiental/area_estudio/PoligonoBase",
"id_ambiental-id_capa_hueco": "/home/sonickseven/www/anla-validator/geoEjemeplo/estudio_ambiental/ambiental/CapaHueco",
"id_forestal-id_puntos": "/home/sonickseven/www/anla-validator/geoEjemeplo/estudio_ambiental/forestal/PuntosDentro"
}
```
### Comando para correr en local
`cargo run src/main.rs`