Skip to content
Snippets Groups Projects
Commit 6957c57f authored by Simon McVittie's avatar Simon McVittie
Browse files

Merge branch 'wip/jpwhiting/stringifyenums' into 'master'

Make stringification of enums, flags less repetitive

See merge request steam/steam-runtime-tools!90
parents bec73f3b 5963db9f
No related branches found
No related tags found
1 merge request!90Make stringification of enums, flags less repetitive
Pipeline #2113 passed
...@@ -125,6 +125,8 @@ ...@@ -125,6 +125,8 @@
#include <json-glib/json-glib.h> #include <json-glib/json-glib.h>
#include <steam-runtime-tools/utils-internal.h>
enum enum
{ {
OPTION_HELP = 1, OPTION_HELP = 1,
...@@ -212,153 +214,92 @@ divert_stdout_to_stderr (GError **error) ...@@ -212,153 +214,92 @@ divert_stdout_to_stderr (GError **error)
} }
static void static void
jsonify_library_issues (JsonBuilder *builder, jsonify_flags (JsonBuilder *builder,
SrtLibraryIssues issues) GType flags_type,
unsigned int values)
{ {
if ((issues & SRT_LIBRARY_ISSUES_CANNOT_LOAD) != 0) GFlagsClass *class;
json_builder_add_string_value (builder, "cannot-load"); GFlagsValue *flags_value;
g_return_if_fail (G_TYPE_IS_FLAGS (flags_type));
class = g_type_class_ref (flags_type);
while (values != 0)
{
flags_value = g_flags_get_first_value (class, values);
if ((issues & SRT_LIBRARY_ISSUES_MISSING_SYMBOLS) != 0) if (flags_value == NULL)
json_builder_add_string_value (builder, "missing-symbols"); break;
if ((issues & SRT_LIBRARY_ISSUES_MISVERSIONED_SYMBOLS) != 0) json_builder_add_string_value (builder, flags_value->value_nick);
json_builder_add_string_value (builder, "misversioned-symbols"); values &= ~flags_value->value;
}
if (values)
{
gchar *rest = g_strdup_printf ("0x%x", values);
json_builder_add_string_value (builder, rest);
g_free (rest);
}
if ((issues & SRT_LIBRARY_ISSUES_INTERNAL_ERROR) != 0) g_type_class_unref (class);
json_builder_add_string_value (builder, "internal-error"); }
if ((issues & SRT_LIBRARY_ISSUES_UNKNOWN_EXPECTATIONS) != 0) static void
json_builder_add_string_value (builder, "unknown-expectations"); jsonify_library_issues (JsonBuilder *builder,
SrtLibraryIssues issues)
{
jsonify_flags (builder, SRT_TYPE_LIBRARY_ISSUES, issues);
} }
static void static void
jsonify_graphics_issues (JsonBuilder *builder, jsonify_graphics_issues (JsonBuilder *builder,
SrtGraphicsIssues issues) SrtGraphicsIssues issues)
{ {
if ((issues & SRT_GRAPHICS_ISSUES_CANNOT_LOAD) != 0) jsonify_flags (builder, SRT_TYPE_GRAPHICS_ISSUES, issues);
json_builder_add_string_value (builder, "cannot-load");
if ((issues & SRT_GRAPHICS_ISSUES_INTERNAL_ERROR) != 0)
json_builder_add_string_value (builder, "internal-error");
if ((issues & SRT_GRAPHICS_ISSUES_SOFTWARE_RENDERING) != 0)
json_builder_add_string_value (builder, "software-rendering");
if ((issues & SRT_GRAPHICS_ISSUES_TIMEOUT) != 0)
json_builder_add_string_value (builder, "timeout");
if ((issues & SRT_GRAPHICS_ISSUES_CANNOT_DRAW) != 0)
json_builder_add_string_value (builder, "cannot-draw");
} }
static void static void
jsonify_graphics_library_vendor (JsonBuilder *builder, jsonify_graphics_library_vendor (JsonBuilder *builder,
SrtGraphicsLibraryVendor vendor) SrtGraphicsLibraryVendor vendor)
{ {
if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN) const char *s = srt_enum_value_to_nick (SRT_TYPE_GRAPHICS_LIBRARY_VENDOR, vendor);
json_builder_add_string_value (builder, "unknown");
else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_GLVND)
json_builder_add_string_value (builder, "glvnd");
else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN_NON_GLVND)
json_builder_add_string_value (builder, "unknown-non-glvnd");
else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_MESA)
json_builder_add_string_value (builder, "mesa");
else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_NVIDIA)
json_builder_add_string_value (builder, "nvidia");
if (s != NULL)
{
json_builder_add_string_value (builder, s);
}
else else
json_builder_add_string_value (builder, "unexpected-vendor"); {
gchar *fallback = g_strdup_printf ("(unknown value %d)", vendor);
json_builder_add_string_value (builder, fallback);
g_free (fallback);
}
} }
static void static void
jsonify_steam_issues (JsonBuilder *builder, jsonify_steam_issues (JsonBuilder *builder,
SrtSteamIssues issues) SrtSteamIssues issues)
{ {
if ((issues & SRT_STEAM_ISSUES_INTERNAL_ERROR) != 0) jsonify_flags (builder, SRT_TYPE_STEAM_ISSUES, issues);
json_builder_add_string_value (builder, "internal-error");
if ((issues & SRT_STEAM_ISSUES_CANNOT_FIND) != 0)
json_builder_add_string_value (builder, "cannot-find");
if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_STEAM_NOT_SYMLINK) != 0)
json_builder_add_string_value (builder, "dot-steam-steam-not-symlink");
if ((issues & SRT_STEAM_ISSUES_CANNOT_FIND_DATA) != 0)
json_builder_add_string_value (builder, "cannot-find-data");
if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_STEAM_NOT_DIRECTORY) != 0)
json_builder_add_string_value (builder, "dot-steam-steam-not-directory");
if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_ROOT_NOT_SYMLINK) != 0)
json_builder_add_string_value (builder, "dot-steam-root-not-symlink");
if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_ROOT_NOT_DIRECTORY) != 0)
json_builder_add_string_value (builder, "dot-steam-root-not-directory");
} }
static void static void
jsonify_runtime_issues (JsonBuilder *builder, jsonify_runtime_issues (JsonBuilder *builder,
SrtRuntimeIssues issues) SrtRuntimeIssues issues)
{ {
if ((issues & SRT_RUNTIME_ISSUES_INTERNAL_ERROR) != 0) jsonify_flags (builder, SRT_TYPE_RUNTIME_ISSUES, issues);
json_builder_add_string_value (builder, "internal-error");
if ((issues & SRT_RUNTIME_ISSUES_DISABLED) != 0)
json_builder_add_string_value (builder, "disabled");
if ((issues & SRT_RUNTIME_ISSUES_NOT_RUNTIME) != 0)
json_builder_add_string_value (builder, "not-runtime");
if ((issues & SRT_RUNTIME_ISSUES_UNOFFICIAL) != 0)
json_builder_add_string_value (builder, "unofficial");
if ((issues & SRT_RUNTIME_ISSUES_UNEXPECTED_LOCATION) != 0)
json_builder_add_string_value (builder, "unexpected-location");
if ((issues & SRT_RUNTIME_ISSUES_UNEXPECTED_VERSION) != 0)
json_builder_add_string_value (builder, "unexpected-version");
if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_LD_PATH) != 0)
json_builder_add_string_value (builder, "not-in-ld-path");
if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_PATH) != 0)
json_builder_add_string_value (builder, "not-in-path");
if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_ENVIRONMENT) != 0)
json_builder_add_string_value (builder, "not-in-environment");
if ((issues & SRT_RUNTIME_ISSUES_NOT_USING_NEWER_HOST_LIBRARIES) != 0)
json_builder_add_string_value (builder, "not-using-newer-host-libraries");
} }
static void static void
jsonify_locale_issues (JsonBuilder *builder, jsonify_locale_issues (JsonBuilder *builder,
SrtLocaleIssues issues) SrtLocaleIssues issues)
{ {
if ((issues & SRT_LOCALE_ISSUES_INTERNAL_ERROR) != 0) jsonify_flags (builder, SRT_TYPE_LOCALE_ISSUES, issues);
json_builder_add_string_value (builder, "internal-error");
if ((issues & SRT_LOCALE_ISSUES_DEFAULT_MISSING) != 0)
json_builder_add_string_value (builder, "default-missing");
if ((issues & SRT_LOCALE_ISSUES_DEFAULT_NOT_UTF8) != 0)
json_builder_add_string_value (builder, "default-not-utf8");
if ((issues & SRT_LOCALE_ISSUES_C_UTF8_MISSING) != 0)
json_builder_add_string_value (builder, "c-utf8-missing");
if ((issues & SRT_LOCALE_ISSUES_EN_US_UTF8_MISSING) != 0)
json_builder_add_string_value (builder, "en-us-utf8-missing");
if ((issues & SRT_LOCALE_ISSUES_I18N_SUPPORTED_MISSING) != 0)
json_builder_add_string_value (builder, "i18n-supported-missing");
if ((issues & SRT_LOCALE_ISSUES_I18N_LOCALES_EN_US_MISSING) != 0)
json_builder_add_string_value (builder, "i18n-locales-en-us-missing");
} }
static void static void
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#pragma once #pragma once
#include "steam-runtime-tools/steam-runtime-tools.h" #include "steam-runtime-tools/steam-runtime-tools.h"
#include "steam-runtime-tools/utils-internal.h"
/* /*
* _srt_graphics_new: * _srt_graphics_new:
...@@ -117,24 +118,25 @@ static inline int _srt_graphics_hash_key(SrtWindowSystem window_system, ...@@ -117,24 +118,25 @@ static inline int _srt_graphics_hash_key(SrtWindowSystem window_system,
static inline const gchar * static inline const gchar *
_srt_graphics_window_system_string (SrtWindowSystem window_system) _srt_graphics_window_system_string (SrtWindowSystem window_system)
{ {
if (window_system == SRT_WINDOW_SYSTEM_X11) const gchar *result = srt_enum_value_to_nick (SRT_TYPE_WINDOW_SYSTEM, window_system);
return "x11";
else if (window_system == SRT_WINDOW_SYSTEM_GLX) if (window_system == SRT_WINDOW_SYSTEM_EGL_X11)
return "glx";
else if (window_system == SRT_WINDOW_SYSTEM_EGL_X11)
return "egl_x11"; return "egl_x11";
if (result != NULL)
return result;
return "unknown window system"; return "unknown window system";
} }
static inline const gchar * static inline const gchar *
_srt_graphics_rendering_interface_string (SrtRenderingInterface rendering_interface) _srt_graphics_rendering_interface_string (SrtRenderingInterface rendering_interface)
{ {
if (rendering_interface == SRT_RENDERING_INTERFACE_GL) const gchar *result = srt_enum_value_to_nick (SRT_TYPE_RENDERING_INTERFACE, rendering_interface);
return "gl";
else if (rendering_interface == SRT_RENDERING_INTERFACE_GLESV2) if (result != NULL)
return "glesv2"; return result;
else if (rendering_interface == SRT_RENDERING_INTERFACE_VULKAN)
return "vulkan";
return "unknown rendering interface"; return "unknown rendering interface";
} }
......
...@@ -48,3 +48,7 @@ G_GNUC_INTERNAL const char *_srt_find_myself (const char **helpers_path_out, ...@@ -48,3 +48,7 @@ G_GNUC_INTERNAL const char *_srt_find_myself (const char **helpers_path_out,
G_GNUC_INTERNAL gboolean _srt_process_timeout_wait_status (int wait_status, G_GNUC_INTERNAL gboolean _srt_process_timeout_wait_status (int wait_status,
int *exit_status, int *exit_status,
int *terminating_signal); int *terminating_signal);
const char *srt_enum_value_to_nick (GType enum_type,
int value);
...@@ -409,6 +409,40 @@ _srt_filter_gameoverlayrenderer (const gchar *input) ...@@ -409,6 +409,40 @@ _srt_filter_gameoverlayrenderer (const gchar *input)
return ret; return ret;
} }
/**
* srt_enum_value_to_nick
* @enum_type: The type of the enumeration.
* @value: The enumeration value to stringify.
*
* Get the #GEnumValue.value-nick of a given enumeration value.
* For example, `srt_enum_value_to_nick (SRT_TYPE_WINDOW_SYSTEM, SRT_WINDOW_SYSTEM_EGL_X11)`
* returns `"egl-x11"`.
*
* Returns: (transfer none): A string representation
* of the given enumeration value.
*/
const char *
srt_enum_value_to_nick (GType enum_type,
int value)
{
GEnumClass *class;
GEnumValue *enum_value;
const char *result;
g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
class = g_type_class_ref (enum_type);
enum_value = g_enum_get_value (class, value);
if (enum_value != NULL)
result = enum_value->value_nick;
else
result = NULL;
g_type_class_unref (class);
return result;
}
#if !GLIB_CHECK_VERSION(2, 36, 0) #if !GLIB_CHECK_VERSION(2, 36, 0)
static void _srt_constructor (void) __attribute__((__constructor__)); static void _srt_constructor (void) __attribute__((__constructor__));
static void static void
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment