Skip to main content

Argus Cheat Sheet

Quick reference for common patterns and syntax.

Basic Setup​

#include <argus.h>

ARGUS_OPTIONS(options,
HELP_OPTION(),
VERSION_OPTION(),
// Your options here
)

int main(int argc, char **argv)
{
argus_t argus = argus_init(options, "program", "1.0.0");
if (argus_parse(&argus, argc, argv) != ARGUS_SUCCESS)
return 1;

// Access values
bool flag = argus_get(&argus, "flag").as_bool;

argus_free(&argus);
return 0;
}

Option Types​

TypeMacroAccessExample
FlagOPTION_FLAG('v', "verbose", ...).as_bool--verbose
StringOPTION_STRING('o', "output", ...).as_string--output file.txt
IntegerOPTION_INT('p', "port", ...).as_int--port 8080
FloatOPTION_FLOAT('r', "rate", ...).as_float--rate 0.5
BooleanOPTION_BOOL('d', "debug", ...).as_bool--debug=true

Collections​

// Arrays
OPTION_ARRAY_STRING('t', "tags", HELP("Tags"))
OPTION_ARRAY_INT('p', "ports", HELP("Ports"))
OPTION_ARRAY_FLOAT('r', "rates", HELP("Rates"))

// Maps
OPTION_MAP_STRING('e', "env", HELP("Environment vars"))
OPTION_MAP_INT('c', "config", HELP("Config values"))
OPTION_MAP_BOOL('f', "features", HELP("Feature flags"))

Positional Arguments​

POSITIONAL_STRING("input", HELP("Input file"))
POSITIONAL_INT("count", HELP("Count"), FLAGS(FLAG_OPTIONAL))

Option Modifiers​

OPTION_STRING('o', "output", 
HELP("Output file"), // Description
DEFAULT("result.txt"), // Default value
HINT("FILE"), // Value hint
FLAGS(FLAG_REQUIRED), // Required option
ENV_VAR("OUTPUT_FILE"), // Environment variable
VALIDATOR(V_LENGTH(1, 100)) // Validation
)

Validation​

VALIDATOR(V_RANGE(1, 100))                 // Numeric range
VALIDATOR(V_LENGTH(3, 20)) // String length
VALIDATOR(V_COUNT(1, 5)) // Collection count
VALIDATOR(V_REGEX(ARGUS_RE_EMAIL)) // Regex pattern

VALIDATOR(V_CHOICE_STR("json", "xml", "yaml")) // String choices
VALIDATOR(V_CHOICE_INT(80, 443, 8080)) // Integer choices

Common Regex Patterns​

ARGUS_RE_EMAIL          // user@example.com
ARGUS_RE_IPV4 // 192.168.1.1
ARGUS_RE_URL // https://example.com
ARGUS_RE_ISO_DATE // 2024-03-15
ARGUS_RE_PHONE_US // 123-456-7890
ARGUS_RE_UUID // 550e8400-e29b-41d4-a716-446655440000

Environment Variables​

int main(int argc, char **argv)
{
argus_t argus = argus_init(options, "app", "1.0.0");
argus.env_prefix = "APP"; // APP_PORT, APP_HOST, etc.
// ...
}

// Option definitions
OPTION_STRING('h', "host", ENV_VAR("HOST")) // Uses APP_HOST
OPTION_INT('p', "port", FLAGS(FLAG_AUTO_ENV)) // Auto-generates APP_PORT
OPTION_STRING('d', "db", ENV_VAR("DATABASE_URL"), // Uses DATABASE_URL exactly
FLAGS(FLAG_NO_ENV_PREFIX))

Flags​

FLAGS(FLAG_REQUIRED)        // Must be provided
FLAGS(FLAG_OPTIONAL) // Optional (positionals)
FLAGS(FLAG_HIDDEN) // Hidden from help
FLAGS(FLAG_ENV_OVERRIDE) // Env overrides CLI
FLAGS(FLAG_AUTO_ENV) // Auto-generate env name
FLAGS(FLAG_NO_ENV_PREFIX) // Skip env prefix

// Collection flags
FLAGS(FLAG_SORTED) // Sort array values
FLAGS(FLAG_UNIQUE) // Remove duplicates
FLAGS(FLAG_SORTED_KEY) // Sort map by keys
FLAGS(FLAG_SORTED_VALUE) // Sort map by values

Value Access​

// Basic access
bool verbose = argus_get(&argus, "verbose").as_bool;
const char *output = argus_get(&argus, "output").as_string;

// Check if set
if (argus_is_set(&argus, "output")) {
// User provided this option
}

// Array access
size_t count = argus_count(&argus, "tags");
const char *first = argus_array_get(&argus, "tags", 0).as_string;

// Map access
const char *user = argus_map_get(&argus, "env", "USER").as_string;

// Iterators
argus_array_it_t it = argus_array_it(&argus, "tags");
while (argus_array_next(&it)) {
printf("%s\n", it.value.as_string);
}

Subcommands​

int add_action(argus_t *argus, void *data)
{
const char *file = argus_get(argus, "file").as_string; // Local option
bool verbose = argus_get(argus, ".verbose").as_bool; // Global option
return 0;
}

ARGUS_OPTIONS(add_options,
HELP_OPTION(),
POSITIONAL_STRING("file", HELP("File to add"))
)

ARGUS_OPTIONS(options,
HELP_OPTION(),
OPTION_FLAG('v', "verbose", HELP("Verbose output")),
SUBCOMMAND("add", add_options, HELP("Add files"), ACTION(add_action))
)

int main(int argc, char **argv)
{
// ... parse ...
if (argus_has_command(&argus)) {
return argus_exec(&argus, NULL);
}
}

Input Formats​

# Flags
--verbose, -v

# Options
--output=file.txt, --output file.txt, -o file.txt, -ofile.txt

# Combined short options
-vf, -vo file.txt, -vofile.txt

# Arrays
--tags=web,api,backend
--tags=web --tags=api --tags=backend
--ports=8000-8005,9000 # Range expansion for integers

# Maps
--env=USER=alice,HOME=/home/alice
--env=USER=alice --env=HOME=/home/alice

# Positional
program input.txt output.txt

# Stop parsing
program --option -- --not-an-option

Error Handling​

// Parse errors are handled automatically
if (argus_parse(&argus, argc, argv) != ARGUS_SUCCESS) {
return 1; // Error already printed
}

// Custom validation errors
if (custom_check_failed) {
fprintf(stderr, "%s: Custom error message\n", argus.program_name);
return 1;
}

Custom Types​

typedef struct { char *host; int port; } endpoint_t;

int endpoint_handler(argus_t *argus, argus_option_t *option, char *arg)
{
endpoint_t *ep = malloc(sizeof(endpoint_t));
// Parse "host:port" into ep
option->value.as_ptr = ep;
option->is_allocated = true;
return ARGUS_SUCCESS;
}

OPTION_BASE('e', "endpoint", VALUE_TYPE_CUSTOM,
HANDLER(endpoint_handler), FREE_HANDLER(endpoint_free))

// Access
endpoint_t *ep = (endpoint_t*)argus_get(&argus, "endpoint").as_ptr;

Groups​

GROUP_START("Connection", GROUP_DESC("Network options")),
OPTION_STRING('h', "host", HELP("Hostname")),
OPTION_INT('p', "port", HELP("Port")),
GROUP_END(),

GROUP_START("Output", GROUP_DESC("Output options")),
OPTION_STRING('o', "output", HELP("Output file")),
OPTION_STRING('f', "format", HELP("Format")),
GROUP_END(),

Complete Example​

ARGUS_OPTIONS(options,
HELP_OPTION(),
VERSION_OPTION(),

OPTION_FLAG('v', "verbose", HELP("Verbose output")),
OPTION_STRING('c', "config", HELP("Config file"), DEFAULT("app.conf")),
OPTION_INT('p', "port", HELP("Port"), VALIDATOR(V_RANGE(1, 65535)),
ENV_VAR("PORT"), DEFAULT(8080)),
OPTION_ARRAY_STRING('t', "tags", HELP("Tags"), FLAGS(FLAG_UNIQUE)),
OPTION_MAP_STRING('e', "env", HELP("Environment"), FLAGS(FLAG_SORTED_KEY)),

POSITIONAL_STRING("input", HELP("Input file")),
POSITIONAL_STRING("output", HELP("Output file"), FLAGS(FLAG_OPTIONAL))
)