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

Mode-aware default value getters and mode metadata. More...

Go to the source code of this file.

Data Structures

struct  mode_descriptor_t
 Metadata for a mode. More...

Functions

const void * get_default_log_file (asciichat_mode_t mode)
 Get mode-specific default value for –log-file.
const void * get_default_port (asciichat_mode_t mode)
 Get mode-specific default value for –port.
const void * get_default_websocket_port (asciichat_mode_t mode)
 Get mode-specific default value for –websocket-port.
void apply_mode_specific_defaults (options_t *opts)
 Apply mode-specific defaults to an options struct after mode detection.
const mode_descriptor_t * get_mode_descriptor (asciichat_mode_t mode)
 Get mode descriptor by mode.
const mode_descriptor_t * get_modes_by_group (const char *group, size_t *out_count)
 Get all mode descriptors for a specific group.

Detailed Description

Mode-aware default value getters and mode metadata.

Provides mode-specific default values and metadata (names, descriptions, groups) for all application modes. Used by option parsing and completion generation.

Author
Zachary Fogg me@zf.nosp@m.o.gg
Date
February 2026

Definition in file mode_defaults.h.

Function Documentation

◆ apply_mode_specific_defaults()

void apply_mode_specific_defaults ( options_t * opts)

Apply mode-specific defaults to an options struct after mode detection.

Updates options that have mode-dependent defaults (like log_file, port, and websocket_port) based on the detected mode. Should be called after mode detection but before option parsing.

Parameters
optsOptions struct to update (must have detected_mode already set)

This function updates options that have mode-dependent defaults (port and websocket_port) based on the detected mode. Log file paths are handled separately by options_get_log_filepath().

Parameters
optsOptions struct to update (must have detected_mode already set)

Definition at line 194 of file mode_defaults.c.

194 {
195 if (!opts) {
196 return;
197 }
198
199 // Apply port default based on mode
200 const int *mode_port = (const int *)get_default_port(opts->detected_mode);
201 if (mode_port && opts->detected_mode != MODE_MCP_SERVER && opts->detected_mode != MODE_API_SERVER) {
202 // Only update if still at a generic default (27224 or 27225)
203 if (opts->port == OPT_PORT_INT_DEFAULT || opts->port == OPT_ACDS_PORT_INT_DEFAULT) {
204 opts->port = *mode_port;
205 }
206 }
207
208 // Apply websocket-port default based on mode
209 const int *mode_websocket_port = (const int *)get_default_websocket_port(opts->detected_mode);
210 if (mode_websocket_port) {
211 // Only update if still at a generic default (27226 or 27227)
214 opts->websocket_port = *mode_websocket_port;
215 }
216 }
217
218 // If TLS cert+key are provided and websocket-port was not explicitly set,
219 // default to 443 (standard HTTPS/WSS port) instead of the mode default.
220 if (opts->tls_cert[0] != '\0' && opts->tls_key[0] != '\0') {
223 opts->websocket_port = 443;
224 }
225 }
226}
#define OPT_ACDS_PORT_INT_DEFAULT
Default ACDS discovery service port (integer).
Definition options.h:594
#define OPT_WEBSOCKET_PORT_ACDS_DEFAULT
Default WebSocket port for discovery-service mode (integer).
Definition options.h:573
#define OPT_PORT_INT_DEFAULT
Default TCP port for client/server communication (integer).
Definition options.h:567
#define OPT_WEBSOCKET_PORT_SERVER_DEFAULT
Default WebSocket port for server mode (integer).
Definition options.h:570
@ MODE_MCP_SERVER
Model Context Protocol rendering server.
Definition options.h:925
@ MODE_API_SERVER
Image-to-ASCII HTTP API server.
Definition options.h:926
const void * get_default_websocket_port(asciichat_mode_t mode)
Get mode-specific default value for –websocket-port.
const void * get_default_port(asciichat_mode_t mode)
Get mode-specific default value for –port.
asciichat_mode_t detected_mode
Mode detected from command-line arguments.
Definition options.h:983
int websocket_port
WebSocket server port (server/discovery-service only).
Definition options.h:1010
char tls_key[256]
Shared TLS private key file path for secure network listeners.
Definition options.h:1012
char tls_cert[256]
Shared TLS certificate file path for secure network listeners.
Definition options.h:1011
int port
Server port number.
Definition options.h:1009

References options_state::detected_mode, get_default_port(), get_default_websocket_port(), MODE_API_SERVER, MODE_MCP_SERVER, OPT_ACDS_PORT_INT_DEFAULT, OPT_PORT_INT_DEFAULT, OPT_WEBSOCKET_PORT_ACDS_DEFAULT, OPT_WEBSOCKET_PORT_SERVER_DEFAULT, options_state::port, options_state::tls_cert, options_state::tls_key, and options_state::websocket_port.

◆ get_default_log_file()

const void * get_default_log_file ( asciichat_mode_t mode)

Get mode-specific default value for –log-file.

Parameters
modeThe mode to get the default for
Returns
Pointer to the default log file path for this mode

Returns empty string - the actual log file path is determined by options_get_log_filepath() which properly handles debug vs release builds and platform-specific temp directories.

Debug builds: Uses current working directory (server.log, client.log, etc.) Release builds: Uses $TMPDIR/ascii-chat/server.log, etc.

Definition at line 111 of file mode_defaults.c.

111 {
112 (void)mode; // Unused
113 // Return empty string - let options_get_log_filepath() handle the defaults
114 return "";
115}

◆ get_default_port()

const void * get_default_port ( asciichat_mode_t mode)

Get mode-specific default value for –port.

Parameters
modeThe mode to get the default for
Returns
Pointer to the default port number for this mode

Definition at line 129 of file mode_defaults.c.

129 {
130 switch (mode) {
131 case MODE_MCP_SERVER: {
132 static const int port = OPT_MCP_PORT_DEFAULT;
133 return &port;
134 }
135 case MODE_API_SERVER: {
136 static const int port = OPT_MCP_PORT_DEFAULT;
137 return &port;
138 }
139 case MODE_SERVER:
140 return &g_port_server;
141 case MODE_CLIENT:
142 return &g_port_client;
144 return &g_port_discovery_service;
145 case MODE_DISCOVERY:
146 return &g_port_discovery;
147 case MODE_MIRROR:
148 case MODE_INVALID:
149 default:
150 // Fallback
151 return &g_port_server;
152 }
153}
#define OPT_MCP_PORT_DEFAULT
Definition options.h:576
@ MODE_CLIENT
Client mode - network client options.
Definition options.h:921
@ MODE_DISCOVERY_SERVICE
Discovery server mode - session management and WebRTC signaling.
Definition options.h:923
@ MODE_INVALID
Invalid mode.
Definition options.h:927
@ 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

References MODE_API_SERVER, MODE_CLIENT, MODE_DISCOVERY, MODE_DISCOVERY_SERVICE, MODE_INVALID, MODE_MCP_SERVER, MODE_MIRROR, MODE_SERVER, and OPT_MCP_PORT_DEFAULT.

Referenced by apply_mode_specific_defaults().

◆ get_default_websocket_port()

const void * get_default_websocket_port ( asciichat_mode_t mode)

Get mode-specific default value for –websocket-port.

Parameters
modeThe mode to get the default for
Returns
Pointer to the default WebSocket port number for this mode

Definition at line 165 of file mode_defaults.c.

165 {
166 switch (mode) {
167 case MODE_SERVER:
168 return &g_websocket_port_server;
170 return &g_websocket_port_discovery_service;
171 case MODE_CLIENT:
172 case MODE_MIRROR:
173 case MODE_DISCOVERY:
174 case MODE_INVALID:
175 default:
176 // Fallback (should not be used for client/mirror/discovery)
177 return &g_websocket_port_server;
178 }
179}

References MODE_CLIENT, MODE_DISCOVERY, MODE_DISCOVERY_SERVICE, MODE_INVALID, MODE_MIRROR, and MODE_SERVER.

Referenced by apply_mode_specific_defaults().

◆ get_mode_descriptor()

const mode_descriptor_t * get_mode_descriptor ( asciichat_mode_t mode)

Get mode descriptor by mode.

Returns metadata (name, description, group) for the given mode. Useful for UI generation and help text.

Parameters
modeMode to look up
Returns
Pointer to mode descriptor, or NULL if mode not found
Example
if (desc) {
printf("Mode: %s\nDescription: %s\nGroup: %s\n",
desc->name, desc->description, desc->group);
}
const mode_descriptor_t * get_mode_descriptor(asciichat_mode_t mode)
Get mode descriptor by mode.
Metadata for a mode.
Definition main.c:410
const char * name
Definition main.c:411
const char * group
const char * description
Definition main.c:412
Parameters
modeMode to look up
Returns
Pointer to mode descriptor, or NULL if not found

Definition at line 43 of file mode_defaults.c.

43 {
44 for (size_t i = 0; g_mode_descriptors[i].name; i++) {
45 if (g_mode_descriptors[i].mode == mode) {
46 return &g_mode_descriptors[i];
47 }
48 }
49 return NULL;
50}

◆ get_modes_by_group()

const mode_descriptor_t * get_modes_by_group ( const char * group,
size_t * out_count )

Get all mode descriptors for a specific group.

Returns all modes in a given category (e.g., "server-like" or "client-like"). The returned array is allocated with SAFE_MALLOC and must be freed by caller.

Parameters
groupGroup name ("server-like" or "client-like")
out_countOUTPUT: Number of modes in this group
Returns
Array of mode descriptors (caller must free with SAFE_FREE), or NULL if group not found
Example
size_t count;
const mode_descriptor_t *server_modes = get_modes_by_group("server-like", &count);
if (server_modes) {
for (size_t i = 0; i < count; i++) {
printf("%s: %s\n", server_modes[i].name, server_modes[i].description);
}
SAFE_FREE(server_modes);
}
#define SAFE_FREE(ptr)
Definition common.h:377
const mode_descriptor_t * get_modes_by_group(const char *group, size_t *out_count)
Get all mode descriptors grouped by category.

Get all mode descriptors for a specific group.

Parameters
groupGroup name ("server-like" or "client-like")
out_countOUTPUT: Number of modes in this group
Returns
Array of mode descriptors, or NULL if group not found

Definition at line 58 of file mode_defaults.c.

58 {
59 if (!group || !out_count) {
60 return NULL;
61 }
62
63 // Count matching modes
64 size_t count = 0;
65 for (size_t i = 0; g_mode_descriptors[i].name; i++) {
66 if (strcmp(g_mode_descriptors[i].group, group) == 0) {
67 count++;
68 }
69 }
70
71 if (count == 0) {
72 *out_count = 0;
73 return NULL;
74 }
75
76 // Allocate result array
77 mode_descriptor_t *result = SAFE_MALLOC((count + 1) * sizeof(mode_descriptor_t), mode_descriptor_t *);
78 size_t idx = 0;
79
80 // Fill result array
81 for (size_t i = 0; g_mode_descriptors[i].name && idx < count; i++) {
82 if (strcmp(g_mode_descriptors[i].group, group) == 0) {
83 result[idx++] = g_mode_descriptors[i];
84 }
85 }
86
87 // Add terminator
88 result[idx].mode = MODE_INVALID;
89 result[idx].name = NULL;
90 result[idx].description = NULL;
91 result[idx].group = NULL;
92
93 *out_count = count;
94 return result;
95}
#define SAFE_MALLOC(size, cast)
Definition common.h:265
asciichat_mode_t mode

References mode_descriptor_t::description, mode_descriptor_t::group, mode_descriptor_t::mode, MODE_INVALID, mode_descriptor_t::name, and SAFE_MALLOC.

Referenced by completions_generate_zsh().