Skip to content

Commit 2b7f7d6

Browse files
authored
feat: add C bindings for getting log levels (#334)
This adds bindings for retrieving the log level name or enum value from a string. It was already present in C++ but missing in C.
1 parent 8a11435 commit 2b7f7d6

File tree

5 files changed

+91
-11
lines changed

5 files changed

+91
-11
lines changed

libs/common/include/launchdarkly/bindings/c/config/logging_builder.h

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
#pragma once
55

6+
#include <launchdarkly/bindings/c/logging/log_level.h>
7+
68
#include <launchdarkly/bindings/c/export.h>
79
#include <launchdarkly/bindings/c/status.h>
810

@@ -17,17 +19,6 @@ extern "C" { // only need to export C interface if
1719
typedef struct _LDLoggingBasicBuilder* LDLoggingBasicBuilder;
1820
typedef struct _LDLoggingCustomBuilder* LDLoggingCustomBuilder;
1921

20-
/**
21-
* Defines the log levels used with the SDK's default logger, or a user-provided
22-
* custom logger.
23-
*/
24-
enum LDLogLevel {
25-
LD_LOG_DEBUG = 0,
26-
LD_LOG_INFO = 1,
27-
LD_LOG_WARN = 2,
28-
LD_LOG_ERROR = 3,
29-
};
30-
3122
typedef bool (*EnabledFn)(enum LDLogLevel level, void* user_data);
3223
typedef void (*WriteFn)(enum LDLogLevel level,
3324
char const* msg,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/** @file */
2+
// NOLINTBEGIN modernize-use-using
3+
4+
#pragma once
5+
6+
#include <launchdarkly/bindings/c/export.h>
7+
#include <launchdarkly/bindings/c/status.h>
8+
9+
#include <stdbool.h>
10+
#include <stddef.h>
11+
12+
#ifdef __cplusplus
13+
extern "C" { // only need to export C interface if
14+
// used by C++ source code
15+
#endif
16+
17+
/**
18+
* Defines the log levels used with the SDK's default logger, or a user-provided
19+
* custom logger.
20+
*/
21+
enum LDLogLevel {
22+
LD_LOG_DEBUG = 0,
23+
LD_LOG_INFO = 1,
24+
LD_LOG_WARN = 2,
25+
LD_LOG_ERROR = 3,
26+
};
27+
28+
/**
29+
* Lookup the name of a LDLogLevel.
30+
* @param level Target level.
31+
* @param level_if_unknown Default name to return if the level wasn't
32+
* recognized.
33+
* @return Name of the level as a string, or level_if_unknown if not recognized.
34+
*/
35+
LD_EXPORT(char const*)
36+
LDLogLevel_Name(enum LDLogLevel level, char const* level_if_unknown);
37+
38+
/**
39+
* Lookup a LDLogLevel by name.
40+
* @param level Name of level.
41+
* @param level_if_unknown Default level to return if the level wasn't
42+
* recognized.
43+
* @return LDLogLevel matching the name, or level_if_unknown if not recognized.
44+
*/
45+
LD_EXPORT(enum LDLogLevel)
46+
LDLogLevel_Enum(char const* level, enum LDLogLevel level_if_unknown);
47+
48+
#ifdef __cplusplus
49+
}
50+
#endif
51+
52+
// NOLINTEND modernize-use-using

libs/common/src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ add_library(${LIBNAME} OBJECT
5252
bindings/c/flag_listener.cpp
5353
bindings/c/memory_routines.cpp
5454
bindings/c/data_source/error_info.cpp
55+
bindings/c/logging/log_level.cpp
5556
log_level.cpp
5657
config/persistence_builder.cpp
5758
config/logging_builder.cpp
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include <launchdarkly/bindings/c/logging/log_level.h>
2+
3+
#include <launchdarkly/logging/log_level.hpp>
4+
5+
LD_EXPORT(char const*)
6+
LDLogLevel_Name(LDLogLevel level, char const* name_if_unknown) {
7+
return GetLogLevelName(static_cast<launchdarkly::LogLevel>(level),
8+
name_if_unknown);
9+
}
10+
11+
LD_EXPORT(LDLogLevel)
12+
LDLogLevel_Enum(char const* level, LDLogLevel level_if_unknown) {
13+
return static_cast<LDLogLevel>(GetLogLevelEnum(
14+
level, static_cast<launchdarkly::LogLevel>(level_if_unknown)));
15+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include <launchdarkly/bindings/c/logging/log_level.h>
2+
3+
#include <gtest/gtest.h>
4+
5+
TEST(LogLevelTests, LogLevelToString) {
6+
ASSERT_STREQ("debug", LDLogLevel_Name(LD_LOG_DEBUG, "unknown"));
7+
ASSERT_STREQ("info", LDLogLevel_Name(LD_LOG_INFO, "unknown"));
8+
ASSERT_STREQ("warn", LDLogLevel_Name(LD_LOG_WARN, "unknown"));
9+
ASSERT_STREQ("error", LDLogLevel_Name(LD_LOG_ERROR, "unknown"));
10+
ASSERT_STREQ("unknown",
11+
LDLogLevel_Name(static_cast<LDLogLevel>(4141), "unknown"));
12+
}
13+
14+
TEST(LogLevelTests, LogLevelToEnum) {
15+
constexpr auto unknown = static_cast<LDLogLevel>(4141);
16+
ASSERT_EQ(LD_LOG_DEBUG, LDLogLevel_Enum("debug", unknown));
17+
ASSERT_EQ(LD_LOG_INFO, LDLogLevel_Enum("info", unknown));
18+
ASSERT_EQ(LD_LOG_WARN, LDLogLevel_Enum("warn", unknown));
19+
ASSERT_EQ(LD_LOG_ERROR, LDLogLevel_Enum("error", unknown));
20+
ASSERT_EQ(unknown, LDLogLevel_Enum("potato", unknown));
21+
}

0 commit comments

Comments
 (0)