Référence des types
Cette page documente les types de données et structures de base fournis par la bibliothèque argus. La compréhension de ces types est essentielle pour une utilisation avancée et des extensions personnalisées.
Aperçu
argus définit plusieurs types de données et structures clés qui forment la base de la bibliothèque :
- Structures de base - Structures de données principales comme
argus_tetargus_option_t - Types de valeurs - Types pour stocker et accéder à différentes sortes de valeurs
- Énumérations - Classificateurs de types et définitions de drapeaux
- Collections - Structures de données de tableaux et de maps, et itérateurs
- Types de callbacks - Types de pointeurs de fonction pour les gestionnaires et validateurs
Structures de base
argus_t
La structure de contexte principale qui contient tous les états d'analyse et la configuration.
typedef struct argus_s {
/* Champs publics */
const char *program_name; // Nom du programme
const char *version; // Version du programme
const char *description; // Description du programme
const char *env_prefix; // Préfixe pour les variables d'environnement
/* Champs internes - ne pas accéder directement */
argus_option_t *options; // Options définies
argus_error_stack_t error_stack; // Pile d'erreurs
struct { /* ... */ } context; // Contexte interne
} argus_t;
Les champs publics peuvent être accédés et modifiés directement après l'initialisation avec argus_init() :
argus_t argus = argus_init(options, "my_program", "1.0.0");
argus.description = "Mon super programme";
argus.env_prefix = "MYAPP"; // Optionnel : préfixe pour les variables d'environnement
Champs internes
Les champs internes ne doivent pas être accédés directement. Utilisez les fonctions API fournies pour interagir avec eux.
argus_option_t
Définit une option de ligne de commande avec toutes ses propriétés et son comportement.
typedef struct argus_option_s {
/* Métadonnées de base */
argus_optype_t type; // Type d'option (drapeau, positionnel, etc.)
const char *name; // Nom interne pour les références
char sname; // Nom court (ex., 'v' pour -v)
const char *lname; // Nom long (ex., "verbose" pour --verbose)
const char *help; // Texte d'aide
const char *hint; // Indice de valeur pour l'affichage d'aide
/* Métadonnées de valeur */
argus_valtype_t value_type; // Type de valeur
argus_value_t value; // Valeur actuelle
argus_value_t default_value; // Valeur par défaut
bool have_default; // Si une valeur par défaut est définie
/* Champs de valeur supplémentaires... */
/* Callbacks */
argus_handler_t handler; // Fonction gestionnaire de valeur
argus_free_handler_t free_handler; // Fonction de nettoyage des ressources
argus_validator_t validator; // Validateur de valeur
/* Champs de callback supplémentaires... */
/* Dépendances */
const char **requires; // Options qui doivent être définies avec celle-ci
const char **conflicts; // Options qui ne peuvent pas être utilisées avec celle-ci
/* État */
argus_optflags_t flags; // Drapeaux de comportement d'option
bool is_set; // Si l'option a été définie en ligne de commande
/* Champs de sous-commande */
argus_action_t action; // Action pour les sous-commandes
struct argus_option_s *sub_options; // Options pour les sous-commandes
} argus_option_t;
Note
Vous ne créez généralement pas de structures argus_option_t directement. Utilisez plutôt les macros fournies comme OPTION_STRING, OPTION_INT, etc.
Types de valeurs
argus_value_t
Un type union qui peut contenir des valeurs de différents types :
typedef union argus_value_u {
uintptr_t raw; // Valeur brute en entier
void *as_ptr; // Pointeur générique
// Types de base
char as_char; // Caractère
char *as_string; // Chaîne
int as_int; // Entier
long long as_int64; // Entier 64 bits
double as_float; // Flottant
bool as_bool; // Booléen
// Types de collection
argus_value_t *as_array; // Tableau de valeurs
argus_pair_t *as_map; // Map clé-valeur
} argus_value_t;
argus_pair_t
Une paire clé-valeur utilisée dans les collections de type map :
typedef struct argus_pair_s {
const char *key; // Clé chaîne
argus_value_t value; // Valeur de n'importe quel type supporté
} argus_pair_t;
Énumérations
argus_optype_t
Définit les différents types d'éléments de ligne de commande :
typedef enum argus_optype_e {
TYPE_NONE = 0, // Terminateur pour les tableaux d'options
TYPE_OPTION, // Option standard avec préfixe - ou --
TYPE_GROUP, // Groupement logique d'options
TYPE_POSITIONAL, // Argument positionnel
TYPE_SUBCOMMAND, // Sous-commande avec ses propres options
} argus_optype_t;
argus_valtype_t
Définit les types de valeurs qu'une option peut contenir :
typedef enum argus_valtype_e {
VALUE_TYPE_NONE = 0, // Pas de valeur
// Types primitifs
VALUE_TYPE_INT = 1 << 0, // Entier
VALUE_TYPE_STRING = 1 << 1, // Chaîne
VALUE_TYPE_FLOAT = 1 << 2, // Flottant
VALUE_TYPE_BOOL = 1 << 3, // Booléen
VALUE_TYPE_FLAG = 1 << 4, // Drapeau (booléen sans valeur)
// Types de tableau
VALUE_TYPE_ARRAY_STRING = 1 << 5, // Tableau de chaînes
VALUE_TYPE_ARRAY_INT = 1 << 6, // Tableau d'entiers
VALUE_TYPE_ARRAY_FLOAT = 1 << 7, // Tableau de flottants
// Types de map
VALUE_TYPE_MAP_STRING = 1 << 8, // Map de chaînes
VALUE_TYPE_MAP_INT = 1 << 9, // Map d'entiers
VALUE_TYPE_MAP_FLOAT = 1 << 10, // Map de flottants
VALUE_TYPE_MAP_BOOL = 1 << 11, // Map de booléens
VALUE_TYPE_CUSTOM = 1 << 12, // Type personnalisé
} argus_valtype_t;
argus_optflags_t
Définit des drapeaux qui modifient le comportement des options :
typedef enum argus_optflags_e {
FLAG_NONE = 0,
/* Drapeaux d'option */
FLAG_REQUIRED = 1 << 0, // L'option doit être spécifiée
FLAG_HIDDEN = 1 << 1, // L'option est masquée dans l'aide
FLAG_ADVANCED = 1 << 2, // L'option est marquée comme avancée
FLAG_DEPRECATED = 1 << 3, // L'option est marquée comme obsolète
FLAG_EXPERIMENTAL = 1 << 4, // L'option est marquée comme expérimentale
FLAG_EXIT = 1 << 5, // Le programme se termine après le traitement de l'option
FLAG_ENV_OVERRIDE = 1 << 6, // La valeur de l'option peut être remplacée par une variable d'environnement
FLAG_AUTO_ENV = 1 << 7, // Générer automatiquement le nom de variable d'environnement
FLAG_NO_ENV_PREFIX = 1 << 8, // Ne pas utiliser le préfixe de variable d'environnement
/* Drapeaux de type tableau et map */
FLAG_SORTED = 1 << 9, // Les valeurs du tableau sont triées
FLAG_UNIQUE = 1 << 10, // Les valeurs du tableau sont uniques
FLAG_SORTED_VALUE = 1 << 11, // Les valeurs de la map sont triées
FLAG_SORTED_KEY = 1 << 12, // Les clés de la map sont triées
FLAG_UNIQUE_VALUE = 1 << 13, // Les valeurs de la map sont uniques
/* Drapeaux de groupe */
FLAG_EXCLUSIVE = 1 << 14, // Une seule option du groupe peut être définie
} argus_optflags_t;
Itérateurs de collections
argus_array_it_t
Itérateur pour les collections de type tableau :
typedef struct argus_array_iterator_s {
argus_value_t *_array; // Pointeur interne du tableau
size_t _count; // Nombre d'éléments
size_t _position; // Position actuelle
argus_value_t value; // Valeur actuelle
} argus_array_it_t;
Exemple d'utilisation :
argus_array_it_t it = argus_array_it(argus, "names");
while (argus_array_next(&it)) {
printf("Nom : %s\n", it.value.as_string);
}
argus_map_it_t
Itérateur pour les collections de type map :
typedef struct argus_map_iterator_s {
argus_pair_t *_map; // Pointeur interne de la map
size_t _count; // Nombre d'éléments
size_t _position; // Position actuelle
const char *key; // Clé actuelle
argus_value_t value; // Valeur actuelle
} argus_map_it_t;
Exemple d'utilisation :
argus_map_it_t it = argus_map_it(argus, "env");
while (argus_map_next(&it)) {
printf("%s = %s\n", it.key, it.value.as_string);
}
Types de callbacks
argus_handler_t
Fonction gestionnaire pour traiter les valeurs d'options :
Les gestionnaires personnalisés traitent la valeur de chaîne brute et la stockent dans la structure d'option.
argus_free_handler_t
Fonction gestionnaire pour libérer les ressources des options :
Les gestionnaires de libération personnalisés nettoient les ressources allouées par une fonction gestionnaire.
argus_validator_t
Fonction validateur pour vérifier les valeurs d'options :
Les validateurs s'assurent que les valeurs répondent à certains critères après traitement.
argus_pre_validator_t
Fonction pré-validateur pour vérifier les valeurs de chaînes brutes :
Les pré-validateurs vérifient les chaînes d'entrée avant qu'elles ne soient traitées.
argus_action_t
Fonction d'action pour les sous-commandes :
Les actions sont exécutées lorsqu'une sous-commande est invoquée.
Types de données de validateur
validator_data_t
Données passées aux validateurs :
typedef union validator_data_u {
void *custom; // Données de validateur personnalisé
range_t range; // Limites de plage pour la validation numérique
regex_data_t regex; // Motif regex et informations
} validator_data_t;
range_t
Limites de plage pour la validation numérique :
typedef struct range_s {
long long min; // Valeur minimum
long long max; // Valeur maximum
} range_t;
regex_data_t
Données de validation par expression régulière :
typedef struct regex_data_s {
const char *pattern; // Chaîne du motif regex
const char *hint; // Indice de message d'erreur
} regex_data_t;
Types de gestion d'erreurs
argus_error_type_t
Codes d'erreur retournés par les fonctions argus :
typedef enum argus_error_type_e {
ARGUS_SUCCESS = 0, // Pas d'erreur
ARGUS_SOULD_EXIT, // Sortie normale après traitement d'option
/* Erreurs de structure */
ARGUS_ERROR_DUPLICATE_OPTION, // Collision de nom d'option
ARGUS_ERROR_INVALID_HANDLER, // Fonction gestionnaire invalide
/* Plus de codes d'erreur... */
/* Erreurs d'analyse */
ARGUS_ERROR_INVALID_ARGUMENT, // Argument invalide
ARGUS_ERROR_MISSING_VALUE, // Valeur requise non fournie
/* Plus de codes d'erreur... */
} argus_error_type_t;
argus_error_t
Structure pour stocker des informations d'erreur détaillées :
typedef struct argus_error_s {
argus_error_context_t context; // Contexte d'erreur
int code; // Code d'erreur
char message[ARGUS_MAX_ERROR_MESSAGE_SIZE]; // Message d'erreur
} argus_error_t;
Constantes et limites
Argus définit plusieurs constantes qui contrôlent son comportement :
#define MAX_SUBCOMMAND_DEPTH 8 // Profondeur maximale des sous-commandes imbriquées
#define ARGUS_MAX_ERROR_MESSAGE_SIZE 256 // Longueur maximale des messages d'erreur
#define ARGUS_MAX_ERRORS_STACK 16 // Nombre maximum d'erreurs dans la pile
#define MULTI_VALUE_INITIAL_CAPACITY 8 // Capacité initiale pour les collections
Macros et catégories de types
Argus fournit plusieurs macros d'aide pour travailler avec les types de valeurs :
// Macros de catégorie de type
#define VALUE_TYPE_PRIMITIVE \
(VALUE_TYPE_INT | VALUE_TYPE_STRING | VALUE_TYPE_FLOAT | VALUE_TYPE_BOOL)
#define VALUE_TYPE_ARRAY \
(VALUE_TYPE_ARRAY_STRING | VALUE_TYPE_ARRAY_INT | VALUE_TYPE_ARRAY_FLOAT)
#define VALUE_TYPE_MAP \
(VALUE_TYPE_MAP_STRING | VALUE_TYPE_MAP_INT | VALUE_TYPE_MAP_FLOAT | VALUE_TYPE_MAP_BOOL)
// Macros de catégorie de drapeau
#define OPTION_FLAG_MASK \
(FLAG_REQUIRED | FLAG_HIDDEN | FLAG_ADVANCED | FLAG_EXIT | VERSIONING_FLAG_MASK)
#define OPTION_ARRAY_FLAG_MASK \
(FLAG_SORTED | FLAG_UNIQUE | VERSIONING_FLAG_MASK)
// Plus de masques de drapeaux...
Types utilitaires
La bibliothèque inclut également plusieurs types utilitaires pour le suivi des erreurs et la gestion du contexte :
typedef struct argus_error_context_s {
const char *option_name; // Nom d'option actuel
const char *group_name; // Nom de groupe actuel
const char *subcommand_name; // Nom de sous-commande actuel
} argus_error_context_t;
typedef struct argus_error_stack_s {
argus_error_t errors[ARGUS_MAX_ERRORS_STACK]; // Tableau d'erreurs
size_t count; // Nombre d'erreurs
} argus_error_stack_t;
Documentation associée
- Référence des macros - Liste complète des macros de définition d'options
- Référence des fonctions - Référence complète des fonctions API
- Aperçu - Vue d'ensemble de haut niveau de l'API argus