ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
registry.h File Reference

Central registry of all command-line options with mode applicability. More...

Go to the source code of this file.

Functions

asciichat_error_t options_registry_add_all_to_builder (options_builder_t *builder)
 Add all options from registry to builder.
const option_descriptor_t * options_registry_find_by_name (const char *long_name)
 Get option descriptor by name.
const option_descriptor_t * options_registry_find_by_short (char short_name)
 Get option descriptor by short name.
const option_descriptor_t * options_registry_get_for_mode (asciichat_mode_t mode, size_t *num_options)
 Get all options for a specific mode.
const option_descriptor_t * options_registry_get_binary_options (size_t *num_options)
 Get all binary-level options.
const option_descriptor_t * options_registry_get_for_display (asciichat_mode_t mode, bool for_binary_help, size_t *num_options)
 Get options for help/completions display with unified filtering.
const option_metadata_t * options_registry_get_metadata (const char *long_name)
 Get complete metadata for an option.
const char ** options_registry_get_enum_values (const char *option_name, const char ***descriptions, size_t *count)
 Get enum values for an option.
bool options_registry_get_numeric_range (const char *option_name, int *min_out, int *max_out, int *step_out)
 Get numeric range for an option.
const char ** options_registry_get_examples (const char *option_name, size_t *count)
 Get example values for an option.
option_input_type_t options_registry_get_input_type (const char *option_name)
 Get input type for an option.

Detailed Description

Central registry of all command-line options with mode applicability.

This module defines the single source of truth for all command-line options that can be used across all modes (server, client, mirror, discovery service, etc.).

Architecture Overview

The registry is the single source of truth for option definitions. It works with:

  • Builder (builder.h): Use builder to construct custom option configurations, populated from the registry via options_registry_add_all_to_builder().
  • RCU Thread-Safety (rcu.h): Registered options are parsed and published to RCU for lock-free thread-safe access via GET_OPTION() macro.
  • Options System (options.h): The unified parsing system uses the registry to build option configurations for different modes.

Design Philosophy

  • Single Definition: Each option defined exactly once with all metadata (no duplication)
  • Mode Bitmasks: Each option includes mode_bitmask indicating which modes it applies to
  • Automatic Filtering: Registry functions automatically filter by mode
  • Immutable After Load: Once loaded, registry is read-only (no runtime modifications)
  • Shared with Builder: Registry options added to builder via options_registry_add_all_to_builder()
  • Completion Metadata: Each option includes shell completion hints (enums, ranges, examples)

Registry Structure

The registry is defined in registry.c as a static array of option_descriptor_t structures. Each descriptor includes complete metadata:

Identification:

  • Long name (e.g., "port")
  • Short name (e.g., 'p')
  • Argument placeholder (e.g., "NUM", "STR", "PATH")

Type and Storage:

  • Type: BOOL, INT, STRING, DOUBLE, CALLBACK, ACTION
  • Offset into options_t struct (via offsetof())

Documentation:

  • Help text (brief description for –help output)
  • Group name (for organizing help sections: "NETWORK OPTIONS", "DISPLAY OPTIONS", etc.)
  • Visibility flags (hide_from_binary_help, hide_from_mode_help)

Values and Validation:

  • Default value pointer
  • Required flag (must user provide this option?)
  • Environment variable fallback (e.g., PORT, PASSWORD_FILE)
  • Custom validator function (validates across option fields)

Parsing and Actions:

  • Custom parser for OPTION_TYPE_CALLBACK
  • Action function for OPTION_TYPE_ACTION (executes immediately, may exit)

Mode Applicability:

  • Bitmask indicating which modes this option applies to

Completion Metadata (Phase 3):

  • Enum values and descriptions (for shell completions)
  • Numeric range (min, max, step)
  • Example values
  • Input type hint (ENUM, NUMERIC, FILEPATH, CHOICE, etc.)

Mode Bitmask System

Each option includes a mode_bitmask that controls where it appears:

Mode Bitmask Values:

Examples:

.mode_bitmask = OPTION_MODE_CLIENT | OPTION_MODE_MIRROR // Client and mirror modes
.mode_bitmask = OPTION_MODE_SERVER // Server mode only
.mode_bitmask = OPTION_MODE_BINARY | OPTION_MODE_CLIENT // Binary + client options
.mode_bitmask = OPTION_MODE_ALL // All modes
@ OPTION_MODE_ALL
All modes + binary.
Definition options.h:946
@ OPTION_MODE_BINARY
Binary-level options (parsed before mode detection).
Definition options.h:945
@ OPTION_MODE_CLIENT
Client mode (bit 1).
Definition options.h:939
@ OPTION_MODE_SERVER
Server mode (bit 0).
Definition options.h:938
@ OPTION_MODE_MIRROR
Mirror mode (bit 2).
Definition options.h:940

How Mode Filtering Works:

  1. User runs ascii-chat client or ascii-chat server
  2. Mode detection determines detected_mode (MODE_CLIENT, MODE_SERVER, etc.)
  3. Registry functions filter options by matching mode_bitmask
  4. Parser only accepts options for the detected mode
  5. Help output only shows relevant options

Usage Patterns

Pattern 1: Get all options for a specific mode

size_t num_opts;
for (size_t i = 0; i < num_opts; i++) {
printf(\"%s: %s\\n\", opts[i].long_name, opts[i].help_text);
}
@ MODE_CLIENT
Client mode - network client options.
Definition options.h:921
const option_descriptor_t * options_registry_get_for_mode(asciichat_mode_t mode, size_t *num_options)
Get all options for a specific mode.
Definition public_api.c:170
The complete registry entry for one command-line/configuration option.
Definition builder.h:249

Pattern 2: Look up individual options

if (port_opt && (port_opt->mode_bitmask & OPTION_MODE_SERVER)) {
printf(\"Port option available in server mode\\n\");
}
const option_descriptor_t * options_registry_find_by_name(const char *long_name)
Get option descriptor by name.
Definition public_api.c:129

Pattern 3: Populate builder with registry options

options_registry_add_all_to_builder(builder); // Add all registered options
options_config_t * options_builder_build(options_builder_t *builder)
Build immutable options config.
options_builder_t * options_builder_create(size_t struct_size)
Mutable owner used to assemble option descriptors, dependencies, help sections, and examples before b...
struct options_state options_t
Immutable, RCU-published snapshot of the application's runtime configuration.
asciichat_error_t options_registry_add_all_to_builder(options_builder_t *builder)
Add all options from registry to builder.
Definition public_api.c:20
Immutable parsing tables produced from an options builder.
Definition builder.h:457
Immutable parsing tables produced from an options builder.
Definition builder.h:414

Pattern 4: Get shell completion metadata

const option_metadata_t *meta = options_registry_get_metadata(\"color-mode\");
if (meta && meta->input_type == OPTION_INPUT_ENUM) {
size_t count;
const char **values = options_registry_get_enum_values(\"color-mode\", NULL, &count);
// Use values for shell completion suggestions
}
const option_metadata_t * options_registry_get_metadata(const char *long_name)
Get complete metadata for an option.
Definition public_api.c:325
Completion metadata attached to one option descriptor.
Definition builder.h:197

Adding New Options to Registry

To add a new option to the registry:

  1. Add field to options_t struct in include/ascii-chat/options/options.h
  2. Add default constant in options.h (e.g., OPT_MY_OPTION_DEFAULT)
  3. Add registry entry in lib/options/registry.c with:
    • Long and short names
    • Type and storage offset (via offsetof)
    • Default value and validation function
    • Help text and group name
    • Mode bitmask(s) indicating which modes apply
    • Completion metadata (if enum, ranges, or examples needed)

Example Registry Entry:

{
.long_name = \"max-clients\",
.short_name = 'c',
.type = OPTION_TYPE_INT,
.offset = offsetof(options_t, max_clients),
.default_value = &(int){OPT_MAX_CLIENTS_DEFAULT},
.help_text = \"Maximum number of simultaneous clients\",
.group = \"NETWORK OPTIONS\",
.mode_bitmask = OPTION_MODE_SERVER,
.validate = validate_max_clients, // Custom validator
.metadata = {
.input_type = OPTION_INPUT_NUMERIC,
.numeric_range = {.min = 1, .max = 100, .step = 1},
.examples = (const char *[]){\"1\", \"4\", \"10\", NULL},
}
}

Registry Lookup Functions

Core Functions:

Completion Metadata Functions (Phase 3):

RCU Thread-Safety Integration

After registry options are parsed through the builder, they're published via RCU:

// Build config from registered options
// Parse command line
options_config_parse(config, argc, argv, &opts, MODE_DETECTION_RESULT, ...);
// Publish to RCU (lock-free access from worker threads)
// Worker threads now read lock-free via GET_OPTION() macro
asciichat_error_t options_config_parse(const options_config_t *config, int argc, char **argv, void *options_struct, option_mode_bitmask_t detected_mode, int *remaining_argc, char ***remaining_argv)
Parse command-line arguments.
options_t options_t_new(void)
Initialize options by parsing command-line arguments.
Definition options.c:547
asciichat_error_t options_state_init(void)
Initialize RCU options system.
Definition rcu.c:380
asciichat_error_t options_state_set(const options_t *opts)
Set options from a parsed options struct.
Definition rcu.c:450
See also
builder.h - Builder API for constructing option configurations
rcu.h - Thread-safe RCU-based access to published Options Module
options.h - Unified Options Module parsing system (uses registry internally)
Author
Zachary Fogg me@zf.nosp@m.o.gg
Date
January 2026

Definition in file registry.h.

Function Documentation

◆ options_registry_add_all_to_builder()

asciichat_error_t options_registry_add_all_to_builder ( options_builder_t * builder)

Add all options from registry to builder.

Iterates through the central options registry and adds each option to the provided builder with its mode bitmask set.

Parameters
builderOptions builder to add options to
Returns
ASCIICHAT_OK on success, error code on failure

Definition at line 20 of file public_api.c.

20 {
21 if (!builder) {
22 return SET_ERRNO(ERROR_INVALID_PARAM, "Builder is NULL");
23 }
24
26
27 for (size_t i = 0; i < g_registry_size; i++) {
28 const registry_entry_t *entry = &g_options_registry[i];
29 if (!entry->long_name) {
30 continue;
31 }
32 // Silent - no debug logging needed
33
34 switch (entry->type) {
36 options_builder_add_string(builder, entry->long_name, entry->short_name, entry->offset,
37 entry->default_value ? (const char *)entry->default_value : "", entry->help_text,
38 entry->group, entry->required, entry->env_var_name, entry->validate_fn);
39 break;
40 case OPTION_TYPE_INT:
41 // Use metadata-aware function if metadata is present
42 if (entry->metadata.numeric_range.max != 0 ||
43 (entry->metadata.enum_values && entry->metadata.enum_values[0] != NULL)) {
45 entry->default_value ? *(const int *)entry->default_value : 0,
46 entry->help_text, entry->group, entry->required, entry->env_var_name,
47 entry->validate_fn, &entry->metadata);
48 } else {
49 options_builder_add_int(builder, entry->long_name, entry->short_name, entry->offset,
50 entry->default_value ? *(const int *)entry->default_value : 0, entry->help_text,
51 entry->group, entry->required, entry->env_var_name, entry->validate_fn);
52 }
53 break;
55 options_builder_add_bool(builder, entry->long_name, entry->short_name, entry->offset,
56 entry->default_value ? *(const bool *)entry->default_value : false, entry->help_text,
57 entry->group, entry->required, entry->env_var_name);
58 break;
60 // Use metadata-aware function if metadata is present (has numeric range)
61 if (entry->metadata.numeric_range.max != 0) {
63 entry->default_value ? *(const double *)entry->default_value : 0.0,
64 entry->help_text, entry->group, entry->required, entry->env_var_name,
65 entry->validate_fn, &entry->metadata, entry->optional_arg);
66 } else {
67 options_builder_add_double(builder, entry->long_name, entry->short_name, entry->offset,
68 entry->default_value ? *(const double *)entry->default_value : 0.0, entry->help_text,
69 entry->group, entry->required, entry->env_var_name, entry->validate_fn,
70 entry->optional_arg);
71 }
72 break;
74 // Always use metadata-aware function to preserve enum/metadata information
76 entry->default_value, entry->default_value_size, entry->parse_fn,
77 entry->help_text, entry->group, entry->required, entry->env_var_name,
78 entry->optional_arg, &entry->metadata);
79 break;
81 options_builder_add_action(builder, entry->long_name, entry->short_name,
82 options_action_callback(entry->long_name, false), entry->help_text, entry->group);
83 break;
84 }
85
86 if (entry->metadata.enum_values)
90
91 if (entry->type == OPTION_TYPE_STRING && entry->parse_fn)
93
94 // Set mode bitmask on the last added descriptor
96
97 // Set custom arg_placeholder if defined
98 if (entry->arg_placeholder) {
100 }
101 }
102
103 return ASCIICHAT_OK;
104}
option_action_fn options_action_callback(const char *name, bool immediate)
Definition actions.c:716
#define SET_ERRNO(code,...)
void options_builder_set_arg_placeholder(options_builder_t *builder, const char *arg_placeholder)
Set custom argument placeholder on the last added option descriptor.
void options_builder_add_callback_with_metadata(options_builder_t *builder, const char *long_name, char short_name, size_t offset, const void *default_value, size_t value_size, bool(*parse_fn)(const char *arg, void *dest, char **error_msg), const char *help_text, const char *group, bool required, const char *env_var_name, bool optional_arg, const option_metadata_t *metadata)
Add callback option with full metadata (for enums, ranges, examples, etc.).
void options_builder_add_action(options_builder_t *builder, const char *long_name, char short_name, void(*action_fn)(void), const char *help_text, const char *group)
Add action option (executes action and may exit).
void options_builder_set_mode_bitmask(options_builder_t *builder, option_mode_bitmask_t mode_bitmask)
Set mode bitmask on the last added option descriptor.
void options_builder_add_bool(options_builder_t *builder, const char *long_name, char short_name, size_t offset, bool default_value, const char *help_text, const char *group, bool required, const char *env_var_name)
Add boolean flag option.
void options_builder_set_string_parser(options_builder_t *builder, bool(*parser)(const char *, void *, char **))
void options_builder_add_double_with_metadata(options_builder_t *builder, const char *long_name, char short_name, size_t offset, double default_value, const char *help_text, const char *group, bool required, const char *env_var_name, bool(*validate)(const void *options_struct), const option_metadata_t *metadata, bool optional_arg)
void options_builder_set_enum_values(options_builder_t *builder, const char *option_name, const char **values, const char **descriptions)
Set enum values with descriptions for an option.
@ OPTION_TYPE_INT
Integer value (–count 42).
Definition builder.h:168
@ OPTION_TYPE_DOUBLE
Floating point (–ratio 1.5).
Definition builder.h:170
@ OPTION_TYPE_STRING
String value (–name foo).
Definition builder.h:169
@ OPTION_TYPE_ACTION
Action that executes and may exit (–list-webcams, etc.).
Definition builder.h:172
@ OPTION_TYPE_CALLBACK
Custom parser function.
Definition builder.h:171
@ OPTION_TYPE_BOOL
Boolean flag (–flag, no value).
Definition builder.h:167
void options_builder_add_string(options_builder_t *builder, const char *long_name, char short_name, size_t offset, const char *default_value, const char *help_text, const char *group, bool required, const char *env_var_name, bool(*validate)(const void *options_struct))
Add string option.
void options_builder_add_int(options_builder_t *builder, const char *long_name, char short_name, size_t offset, int default_value, const char *help_text, const char *group, bool required, const char *env_var_name, bool(*validate)(const void *options_struct))
Add integer option.
void options_builder_add_int_with_metadata(options_builder_t *builder, const char *long_name, char short_name, size_t offset, int default_value, const char *help_text, const char *group, bool required, const char *env_var_name, bool(*validate)(const void *options_struct), const option_metadata_t *metadata)
Add integer option with metadata (for numeric ranges and examples).
void options_builder_set_input_type(options_builder_t *builder, const char *option_name, option_input_type_t input_type)
Set input type for an option.
void options_builder_add_double(options_builder_t *builder, const char *long_name, char short_name, size_t offset, double default_value, const char *help_text, const char *group, bool required, const char *env_var_name, bool(*validate)(const void *options_struct), bool optional_arg)
Add double/float option.
void registry_init_size(void)
Initialize registry size and metadata.
Definition core.c:108
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
registry_entry_t g_options_registry[2048]
Definition registry.c:41
size_t g_registry_size
Definition registry.c:43
int max
Maximum value (or 0 if no limit).
Definition builder.h:208
const char ** enum_descriptions
Descriptions parallel to enum_values (null-terminated, e.g., "Auto-detect from terminal").
Definition builder.h:202
option_input_type_t input_type
What kind of input this option expects.
Definition builder.h:219
struct option_metadata_t::@061372117173071240020206164036331043262170062306 numeric_range
const char ** enum_values
Enum value strings (null-terminated, e.g., {"auto", "none", "16", "256", "truecolor",...
Definition builder.h:200
Registry entry - stores option definition with mode bitmask and metadata.
option_type_t type
bool(* validate_fn)(const void *options_struct)
bool optional_arg
const char * group
bool required
const char * long_name
size_t default_value_size
option_mode_bitmask_t mode_bitmask
const char * env_var_name
bool(* parse_fn)(const char *arg, void *dest, char **error_msg)
const void * default_value
Default value (single value for all modes, or NULL if mode_default_getter is set).
const char * arg_placeholder
Custom argument placeholder (e.g., "SHELL [FILE]" instead of "STR").
option_metadata_t metadata
Enum values, numeric ranges, examples.
char short_name
const char * help_text
size_t offset

References registry_entry_t::arg_placeholder, ASCIICHAT_OK, registry_entry_t::default_value, registry_entry_t::default_value_size, option_metadata_t::enum_descriptions, option_metadata_t::enum_values, registry_entry_t::env_var_name, ERROR_INVALID_PARAM, g_options_registry, g_registry_size, registry_entry_t::group, registry_entry_t::help_text, option_metadata_t::input_type, registry_entry_t::long_name, option_metadata_t::max, registry_entry_t::metadata, registry_entry_t::mode_bitmask, option_metadata_t::numeric_range, registry_entry_t::offset, OPTION_TYPE_ACTION, OPTION_TYPE_BOOL, OPTION_TYPE_CALLBACK, OPTION_TYPE_DOUBLE, OPTION_TYPE_INT, OPTION_TYPE_STRING, registry_entry_t::optional_arg, options_action_callback(), options_builder_add_action(), options_builder_add_bool(), options_builder_add_callback_with_metadata(), options_builder_add_double(), options_builder_add_double_with_metadata(), options_builder_add_int(), options_builder_add_int_with_metadata(), options_builder_add_string(), options_builder_set_arg_placeholder(), options_builder_set_enum_values(), options_builder_set_input_type(), options_builder_set_mode_bitmask(), options_builder_set_string_parser(), registry_entry_t::parse_fn, registry_init_size(), registry_entry_t::required, SET_ERRNO, registry_entry_t::short_name, registry_entry_t::type, and registry_entry_t::validate_fn.

Referenced by options_preset_unified().

◆ options_registry_find_by_name()

const option_descriptor_t * options_registry_find_by_name ( const char * long_name)

Get option descriptor by name.

Looks up an option descriptor from the registry by its long name.

Parameters
long_nameLong option name (e.g., "port")
Returns
Pointer to option descriptor, or NULL if not found

Definition at line 129 of file public_api.c.

129 {
130 if (!long_name) {
131 SET_ERRNO(ERROR_INVALID_PARAM, "Long name is NULL");
132 return NULL;
133 }
134
136
137 const registry_entry_t *entry = registry_find_entry_by_name(long_name);
138 if (!entry) {
139 // Don't log error for binary-level options like "config" that aren't in registry
140 if (strcmp(long_name, "config") != 0) {
141 SET_ERRNO(ERROR_NOT_FOUND, "Option not found: %s", long_name);
142 }
143 return NULL;
144 }
145
146 static option_descriptor_t desc;
147 desc = registry_entry_to_descriptor(entry);
148 return &desc;
149}
option_descriptor_t registry_entry_to_descriptor(const registry_entry_t *entry)
Convert registry entry to option descriptor.
Definition core.c:161
const registry_entry_t * registry_find_entry_by_name(const char *long_name)
Get a registry entry by long name.
Definition core.c:127
@ ERROR_NOT_FOUND

References ERROR_INVALID_PARAM, ERROR_NOT_FOUND, registry_entry_to_descriptor(), registry_find_entry_by_name(), registry_init_size(), and SET_ERRNO.

◆ options_registry_find_by_short()

const option_descriptor_t * options_registry_find_by_short ( char short_name)

Get option descriptor by short name.

Looks up an option descriptor from the registry by its short name.

Parameters
short_nameShort option character (e.g., 'p')
Returns
Pointer to option descriptor, or NULL if not found

Definition at line 151 of file public_api.c.

151 {
152 if (short_name == '\0') {
153 SET_ERRNO(ERROR_INVALID_PARAM, "Short name is empty");
154 return NULL;
155 }
156
158
159 const registry_entry_t *entry = registry_find_entry_by_short(short_name);
160 if (!entry) {
161 SET_ERRNO(ERROR_NOT_FOUND, "Option not found: -%c", short_name);
162 return NULL;
163 }
164
165 static option_descriptor_t desc;
166 desc = registry_entry_to_descriptor(entry);
167 return &desc;
168}
const registry_entry_t * registry_find_entry_by_short(char short_name)
Get a registry entry by short name.
Definition core.c:145

References ERROR_INVALID_PARAM, ERROR_NOT_FOUND, registry_entry_to_descriptor(), registry_find_entry_by_short(), registry_init_size(), and SET_ERRNO.

◆ options_registry_get_binary_options()

const option_descriptor_t * options_registry_get_binary_options ( size_t * num_options)

Get all binary-level options.

Returns an array of all binary-level options (those with OPTION_MODE_BINARY). The array is allocated and must be freed by the caller.

Parameters
num_optionsOUTPUT: Number of options returned
Returns
Array of option descriptors (caller must free), or NULL on error

Definition at line 238 of file public_api.c.

238 {
239 if (!num_options) {
240 SET_ERRNO(ERROR_INVALID_PARAM, "Number of options is NULL");
241 return NULL;
242 }
243
245
246 /* Count binary-level options */
247 size_t count = 0;
248 for (size_t i = 0; i < g_registry_size; i++) {
249 if (g_options_registry[i].mode_bitmask & OPTION_MODE_BINARY) {
250 count++;
251 }
252 }
253
254 if (count == 0) {
255 *num_options = 0;
256 return NULL;
257 }
258
259 /* Allocate array for binary options */
261 if (!binary_opts) {
262 SET_ERRNO(ERROR_INVALID_STATE, "Failed to allocate binary options array");
263 *num_options = 0;
264 return NULL;
265 }
266
267 /* Copy binary options */
268 size_t idx = 0;
269 for (size_t i = 0; i < g_registry_size; i++) {
270 if (g_options_registry[i].mode_bitmask & OPTION_MODE_BINARY) {
271 binary_opts[idx++] = registry_entry_to_descriptor(&g_options_registry[i]);
272 }
273 }
274
275 *num_options = count;
276 return binary_opts;
277}
#define SAFE_MALLOC(size, cast)
Definition common.h:265
@ ERROR_INVALID_STATE

References ERROR_INVALID_PARAM, ERROR_INVALID_STATE, g_options_registry, g_registry_size, OPTION_MODE_BINARY, registry_entry_to_descriptor(), registry_init_size(), SAFE_MALLOC, and SET_ERRNO.

◆ options_registry_get_enum_values()

const char ** options_registry_get_enum_values ( const char * option_name,
const char *** descriptions,
size_t * count )

Get enum values for an option.

Retrieves enum values and descriptions for an option that has OPTION_INPUT_ENUM type in its metadata.

Parameters
option_nameLong name of option
descriptionsOUTPUT: Pointer to descriptions array (or NULL if not needed)
countOUTPUT: Number of values/descriptions
Returns
Array of enum value strings, or NULL if not found or not an enum type

Example:

const char **values;
const char **descs;
size_t count;
values = options_registry_get_enum_values("color-mode", &descs, &count);
if (values) {
for (size_t i = 0; i < count; i++) {
printf("%s: %s\n", values[i], descs[i]);
}
}
const char ** options_registry_get_enum_values(const char *option_name, const char ***descriptions, size_t *count)
Get enum values for an option.
Definition public_api.c:346

Definition at line 346 of file public_api.c.

346 {
347 if (!option_name || !count) {
348 SET_ERRNO(ERROR_INVALID_PARAM, "Option name is NULL or count is NULL");
349 if (count)
350 *count = 0;
351 return NULL;
352 }
353
354 const option_metadata_t *meta = options_registry_get_metadata(option_name);
355 if (!meta || meta->input_type != OPTION_INPUT_ENUM || !meta->enum_values || meta->enum_values[0] == NULL) {
356 SET_ERRNO(ERROR_NOT_FOUND, "Option '%s' not found", option_name);
357 *count = 0;
358 if (descriptions)
359 *descriptions = NULL;
360 return NULL;
361 }
362
363 // Count enum values (NULL-terminated array)
364 size_t enum_count = 0;
365 while (meta->enum_values[enum_count] != NULL) {
366 enum_count++;
367 }
368
369 *count = enum_count;
370 if (descriptions) {
371 *descriptions = meta->enum_descriptions;
372 }
373 return meta->enum_values;
374}
@ OPTION_INPUT_ENUM
Choose from fixed set of enum values.
Definition builder.h:183

References option_metadata_t::enum_descriptions, option_metadata_t::enum_values, ERROR_INVALID_PARAM, ERROR_NOT_FOUND, option_metadata_t::input_type, OPTION_INPUT_ENUM, options_registry_get_metadata(), and SET_ERRNO.

Referenced by asciichat_suggest_enum_value(), options_get_enum_values(), and options_is_enum_option().

◆ options_registry_get_examples()

const char ** options_registry_get_examples ( const char * option_name,
size_t * count )

Get example values for an option.

Retrieves example values or command invocations for an option.

Parameters
option_nameLong name of option
countOUTPUT: Number of examples
Returns
Array of example strings, or NULL if no examples defined

Definition at line 396 of file public_api.c.

396 {
397 if (!option_name || !count) {
398 SET_ERRNO(ERROR_INVALID_PARAM, "Option name is NULL or count is NULL");
399 if (count)
400 *count = 0;
401 return NULL;
402 }
403
404 const option_metadata_t *meta = options_registry_get_metadata(option_name);
405 if (!meta || !meta->examples || meta->examples[0] == NULL) {
406 *count = 0;
407 return NULL;
408 }
409
410 // Count examples by finding NULL terminator
411 size_t example_count = 0;
412 for (size_t i = 0; meta->examples[i] != NULL; i++) {
413 example_count++;
414 }
415
416 *count = example_count;
417 return meta->examples;
418}
const char ** examples
Example values or command invocations (null-terminated array).
Definition builder.h:213

References ERROR_INVALID_PARAM, option_metadata_t::examples, options_registry_get_metadata(), and SET_ERRNO.

◆ options_registry_get_for_display()

const option_descriptor_t * options_registry_get_for_display ( asciichat_mode_t mode,
bool for_binary_help,
size_t * num_options )

Get options for help/completions display with unified filtering.

Returns options filtered using the same logic as the help system. This ensures help output and completions are always in sync.

Uses the same filtering rules as options_print_help_for_mode():

  • For binary-level help (mode == MODE_DISCOVERY): shows all options that apply to any mode
  • For mode-specific help: shows only options for that mode (binary options excluded unless also mode-specific)
  • Respects hide_from_binary_help and hide_from_mode_help flags
Parameters
modeMode to filter for (use MODE_DISCOVERY for binary-level help)
for_binary_helpIf true, use binary-help filtering; if false, use mode-specific filtering
num_optionsOUTPUT: Number of options returned
Returns
Array of option descriptors (caller must free), or NULL on error
Note
This is the AUTHORITATIVE filtering function for both help and completions. Always use this function to ensure consistency across the application.

Definition at line 279 of file public_api.c.

280 {
281 if (!num_options) {
282 SET_ERRNO(ERROR_INVALID_PARAM, "num_options is NULL");
283 return NULL;
284 }
285
287
288 // Count matching options
289 size_t count = 0;
290 for (size_t i = 0; i < g_registry_size; i++) {
291 if (registry_entry_applies_to_mode(&g_options_registry[i], mode, for_binary_help)) {
292 count++;
293 }
294 }
295
296 if (count == 0) {
297 *num_options = 0;
298 return NULL;
299 }
300
301 // Allocate array
303 if (!descriptors) {
304 SET_ERRNO(ERROR_MEMORY, "Failed to allocate descriptors array");
305 *num_options = 0;
306 return NULL;
307 }
308
309 // Copy matching options
310 size_t idx = 0;
311 for (size_t i = 0; i < g_registry_size; i++) {
312 if (registry_entry_applies_to_mode(&g_options_registry[i], mode, for_binary_help)) {
313 descriptors[idx++] = registry_entry_to_descriptor(&g_options_registry[i]);
314 }
315 }
316
317 *num_options = count;
318 return descriptors;
319}
bool registry_entry_applies_to_mode(const registry_entry_t *entry, asciichat_mode_t mode, bool for_binary_help)
Check if an option applies to the given mode for display purposes.
Definition core.c:200
@ ERROR_MEMORY
Definition error_codes.h:51

References ERROR_INVALID_PARAM, ERROR_MEMORY, g_options_registry, g_registry_size, registry_entry_applies_to_mode(), registry_entry_to_descriptor(), registry_init_size(), SAFE_MALLOC, and SET_ERRNO.

Referenced by completions_generate_fish(), completions_generate_powershell(), and completions_generate_zsh().

◆ options_registry_get_for_mode()

const option_descriptor_t * options_registry_get_for_mode ( asciichat_mode_t mode,
size_t * num_options )

Get all options for a specific mode.

Returns an array of option descriptors that apply to the given mode. The array is allocated and must be freed by the caller.

Parameters
modeMode to filter by
num_optionsOUTPUT: Number of options returned
Returns
Array of option descriptors (caller must free), or NULL on error

Definition at line 170 of file public_api.c.

170 {
171 if (!num_options) {
172 SET_ERRNO(ERROR_INVALID_PARAM, "Number of options is NULL");
173 return NULL;
174 }
175
177
178 /* Convert mode to bitmask */
179 option_mode_bitmask_t mode_bitmask = 0;
180 switch (mode) {
181 case MODE_SERVER:
182 mode_bitmask = OPTION_MODE_SERVER;
183 break;
184 case MODE_CLIENT:
185 mode_bitmask = OPTION_MODE_CLIENT;
186 break;
187 case MODE_MIRROR:
188 mode_bitmask = OPTION_MODE_MIRROR;
189 break;
191 mode_bitmask = OPTION_MODE_DISCOVERY_SVC;
192 break;
193 case MODE_DISCOVERY:
194 mode_bitmask = OPTION_MODE_DISCOVERY;
195 break;
196 case MODE_MCP_SERVER:
197 mode_bitmask = OPTION_MODE_MCP_SERVER;
198 break;
199 default:
200 SET_ERRNO(ERROR_INVALID_PARAM, "Invalid mode: %d", mode);
201 *num_options = 0;
202 return NULL;
203 }
204
205 /* Count matching options */
206 size_t count = 0;
207 for (size_t i = 0; i < g_registry_size; i++) {
208 if (g_options_registry[i].mode_bitmask & mode_bitmask) {
209 count++;
210 }
211 }
212
213 if (count == 0) {
214 *num_options = 0;
215 return NULL;
216 }
217
218 /* Allocate array for matching options */
220 if (!filtered) {
221 SET_ERRNO(ERROR_INVALID_STATE, "Failed to allocate filtered options array");
222 *num_options = 0;
223 return NULL;
224 }
225
226 /* Copy matching options */
227 size_t idx = 0;
228 for (size_t i = 0; i < g_registry_size; i++) {
229 if (g_options_registry[i].mode_bitmask & mode_bitmask) {
231 }
232 }
233
234 *num_options = count;
235 return filtered;
236}
option_mode_bitmask_t
Option mode bitmask.
Definition options.h:936
@ MODE_MCP_SERVER
Model Context Protocol rendering server.
Definition options.h:925
@ MODE_DISCOVERY_SERVICE
Discovery server mode - session management and WebRTC signaling.
Definition options.h:923
@ MODE_SERVER
Server mode - network server options.
Definition options.h:920
@ MODE_MIRROR
Mirror mode - local webcam viewing (no network).
Definition options.h:922
@ MODE_DISCOVERY
Discovery mode - participant that can dynamically become host.
Definition options.h:924
@ OPTION_MODE_DISCOVERY
Discovery mode (bit 4).
Definition options.h:942
@ OPTION_MODE_MCP_SERVER
Definition options.h:943
@ OPTION_MODE_DISCOVERY_SVC
Discovery server mode (bit 3).
Definition options.h:941

References ERROR_INVALID_PARAM, ERROR_INVALID_STATE, g_options_registry, g_registry_size, MODE_CLIENT, MODE_DISCOVERY, MODE_DISCOVERY_SERVICE, MODE_MCP_SERVER, MODE_MIRROR, MODE_SERVER, OPTION_MODE_CLIENT, OPTION_MODE_DISCOVERY, OPTION_MODE_DISCOVERY_SVC, OPTION_MODE_MCP_SERVER, OPTION_MODE_MIRROR, OPTION_MODE_SERVER, registry_entry_to_descriptor(), registry_init_size(), SAFE_MALLOC, and SET_ERRNO.

Referenced by completions_collect_all_modes_unique().

◆ options_registry_get_input_type()

option_input_type_t options_registry_get_input_type ( const char * option_name)

Get input type for an option.

Retrieves the input type (OPTION_INPUT_ENUM, OPTION_INPUT_NUMERIC, etc.) for the given option.

Parameters
option_nameLong name of option
Returns
Input type (OPTION_INPUT_NONE if not found)

Definition at line 420 of file public_api.c.

420 {
421 if (!option_name) {
422 SET_ERRNO(ERROR_INVALID_PARAM, "Option name is NULL");
423 return OPTION_INPUT_NONE;
424 }
425
426 const option_metadata_t *meta = options_registry_get_metadata(option_name);
427 if (!meta) {
428 SET_ERRNO(ERROR_NOT_FOUND, "Option '%s' not found", option_name);
429 return OPTION_INPUT_NONE;
430 }
431
432 return meta->input_type;
433}
@ OPTION_INPUT_NONE
No input (boolean flag).
Definition builder.h:182

References ERROR_INVALID_PARAM, ERROR_NOT_FOUND, option_metadata_t::input_type, OPTION_INPUT_NONE, options_registry_get_metadata(), and SET_ERRNO.

◆ options_registry_get_metadata()

const option_metadata_t * options_registry_get_metadata ( const char * long_name)

Get complete metadata for an option.

Retrieves all completion metadata for the given option, including enum values, numeric ranges, examples, input type, etc.

Parameters
long_nameLong name of option to look up
Returns
Pointer to metadata structure, or NULL if option not found
Note
The returned pointer points to data within the registry and should not be modified or freed.

Definition at line 325 of file public_api.c.

325 {
326 if (!long_name) {
327 SET_ERRNO(ERROR_INVALID_PARAM, "Long name is NULL");
328 return NULL;
329 }
330
331 // Look up option in registry and return its metadata
333 for (size_t i = 0; i < g_registry_size; i++) {
334 const registry_entry_t *entry = &g_options_registry[i];
335 if (entry->long_name && strcmp(entry->long_name, long_name) == 0) {
336 // Return the metadata from the registry entry
337 return &entry->metadata;
338 }
339 }
340
341 // If not found, return empty metadata
342 static option_metadata_t empty_metadata = {0};
343 return &empty_metadata;
344}

References ERROR_INVALID_PARAM, g_options_registry, g_registry_size, registry_entry_t::long_name, registry_entry_t::metadata, registry_init_size(), and SET_ERRNO.

Referenced by options_get_enum_entries(), options_registry_get_enum_values(), options_registry_get_examples(), options_registry_get_input_type(), and options_registry_get_numeric_range().

◆ options_registry_get_numeric_range()

bool options_registry_get_numeric_range ( const char * option_name,
int * min_out,
int * max_out,
int * step_out )

Get numeric range for an option.

Retrieves min/max/step values for an option that has OPTION_INPUT_NUMERIC type in its metadata.

Parameters
option_nameLong name of option
min_outOUTPUT: Minimum value (or 0 if no limit)
max_outOUTPUT: Maximum value (or 0 if no limit)
step_outOUTPUT: Step size (or 0 if continuous)
Returns
true if option found and has numeric range, false otherwise

Example:

int min, max, step;
if (options_registry_get_numeric_range("compression-level", &min, &max, &step)) {
printf("Range: %d-%d (step: %d)\n", min, max, step);
}
bool options_registry_get_numeric_range(const char *option_name, int *min_out, int *max_out, int *step_out)
Get numeric range for an option.
Definition public_api.c:376

Definition at line 376 of file public_api.c.

376 {
377 if (!option_name || !min_out || !max_out || !step_out) {
378 SET_ERRNO(ERROR_INVALID_PARAM, "Option name is NULL or min_out, max_out, or step_out is NULL");
379 return false;
380 }
381
382 const option_metadata_t *meta = options_registry_get_metadata(option_name);
383 if (!meta || meta->input_type != OPTION_INPUT_NUMERIC) {
384 *min_out = 0;
385 *max_out = 0;
386 *step_out = 0;
387 return false;
388 }
389
390 *min_out = meta->numeric_range.min;
391 *max_out = meta->numeric_range.max;
392 *step_out = meta->numeric_range.step;
393 return true;
394}
@ OPTION_INPUT_NUMERIC
Numeric value with optional min/max/step.
Definition builder.h:184
int min
Minimum value (or 0 if no limit).
Definition builder.h:207
int step
Step size (0 = no step, continuous).
Definition builder.h:209

References ERROR_INVALID_PARAM, option_metadata_t::input_type, option_metadata_t::max, option_metadata_t::min, option_metadata_t::numeric_range, OPTION_INPUT_NUMERIC, options_registry_get_metadata(), SET_ERRNO, and option_metadata_t::step.