Skip to content

Commit b5cd31c

Browse files
committed
kernel: add log level/category name getters
Expose btck_log_level_get_name and btck_log_category_get_name to allow library users to get string representations of log levels and categories. Use constexpr lookup tables as a single source of truth for mapping btck types to both BCLog equivalents and string names.
1 parent bacbe70 commit b5cd31c

File tree

4 files changed

+117
-50
lines changed

4 files changed

+117
-50
lines changed

src/kernel/bitcoinkernel.cpp

Lines changed: 59 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
#include <validation.h>
3838
#include <validationinterface.h>
3939

40+
#include <array>
41+
#include <cassert>
4042
#include <cstddef>
4143
#include <cstring>
4244
#include <exception>
@@ -47,6 +49,7 @@
4749
#include <span>
4850
#include <stdexcept>
4951
#include <string>
52+
#include <string_view>
5053
#include <tuple>
5154
#include <utility>
5255
#include <vector>
@@ -146,60 +149,52 @@ struct btck_BlockValidationState : Handle<btck_BlockValidationState, BlockValida
146149

147150
namespace {
148151

149-
BCLog::Level get_bclog_level(btck_LogLevel level)
152+
153+
struct LogLevelMapping {
154+
util::log::Level bclog;
155+
std::string_view name;
156+
};
157+
158+
// Single source of truth for log level mappings (indexed by btck_LogLevel)
159+
constexpr auto LOG_LEVELS = [] {
160+
std::array<LogLevelMapping, 3> a{};
161+
a[btck_LogLevel_TRACE] = {util::log::Level::Trace, "trace"};
162+
a[btck_LogLevel_DEBUG] = {util::log::Level::Debug, "debug"};
163+
a[btck_LogLevel_INFO] = {util::log::Level::Info, "info"};
164+
return a;
165+
}();
166+
167+
constexpr util::log::Level get_bclog_level(btck_LogLevel level)
150168
{
151-
switch (level) {
152-
case btck_LogLevel_INFO: {
153-
return BCLog::Level::Info;
154-
}
155-
case btck_LogLevel_DEBUG: {
156-
return BCLog::Level::Debug;
157-
}
158-
case btck_LogLevel_TRACE: {
159-
return BCLog::Level::Trace;
160-
}
161-
}
162-
assert(false);
169+
assert(level < LOG_LEVELS.size());
170+
return LOG_LEVELS[level].bclog;
163171
}
164172

165-
BCLog::LogFlags get_bclog_flag(btck_LogCategory category)
173+
struct LogCategoryMapping {
174+
BCLog::LogFlags bclog;
175+
std::string_view name;
176+
};
177+
178+
// Single source of truth for log category mappings (indexed by btck_LogCategory)
179+
constexpr auto LOG_CATEGORIES = [] {
180+
std::array<LogCategoryMapping, 11> a{};
181+
a[btck_LogCategory_ALL] = {BCLog::LogFlags::ALL, "all"};
182+
a[btck_LogCategory_BENCH] = {BCLog::LogFlags::BENCH, "bench"};
183+
a[btck_LogCategory_BLOCKSTORAGE] = {BCLog::LogFlags::BLOCKSTORAGE, "blockstorage"};
184+
a[btck_LogCategory_COINDB] = {BCLog::LogFlags::COINDB, "coindb"};
185+
a[btck_LogCategory_LEVELDB] = {BCLog::LogFlags::LEVELDB, "leveldb"};
186+
a[btck_LogCategory_MEMPOOL] = {BCLog::LogFlags::MEMPOOL, "mempool"};
187+
a[btck_LogCategory_PRUNE] = {BCLog::LogFlags::PRUNE, "prune"};
188+
a[btck_LogCategory_RAND] = {BCLog::LogFlags::RAND, "rand"};
189+
a[btck_LogCategory_REINDEX] = {BCLog::LogFlags::REINDEX, "reindex"};
190+
a[btck_LogCategory_VALIDATION] = {BCLog::LogFlags::VALIDATION, "validation"};
191+
a[btck_LogCategory_KERNEL] = {BCLog::LogFlags::KERNEL, "kernel"};
192+
return a;
193+
}();
194+
195+
constexpr BCLog::LogFlags get_bclog_flag(btck_LogCategory category)
166196
{
167-
switch (category) {
168-
case btck_LogCategory_BENCH: {
169-
return BCLog::LogFlags::BENCH;
170-
}
171-
case btck_LogCategory_BLOCKSTORAGE: {
172-
return BCLog::LogFlags::BLOCKSTORAGE;
173-
}
174-
case btck_LogCategory_COINDB: {
175-
return BCLog::LogFlags::COINDB;
176-
}
177-
case btck_LogCategory_LEVELDB: {
178-
return BCLog::LogFlags::LEVELDB;
179-
}
180-
case btck_LogCategory_MEMPOOL: {
181-
return BCLog::LogFlags::MEMPOOL;
182-
}
183-
case btck_LogCategory_PRUNE: {
184-
return BCLog::LogFlags::PRUNE;
185-
}
186-
case btck_LogCategory_RAND: {
187-
return BCLog::LogFlags::RAND;
188-
}
189-
case btck_LogCategory_REINDEX: {
190-
return BCLog::LogFlags::REINDEX;
191-
}
192-
case btck_LogCategory_VALIDATION: {
193-
return BCLog::LogFlags::VALIDATION;
194-
}
195-
case btck_LogCategory_KERNEL: {
196-
return BCLog::LogFlags::KERNEL;
197-
}
198-
case btck_LogCategory_ALL: {
199-
return BCLog::LogFlags::ALL;
200-
}
201-
}
202-
assert(false);
197+
return LOG_CATEGORIES[category].bclog;
203198
}
204199

205200
btck_SynchronizationState cast_state(SynchronizationState state)
@@ -787,6 +782,20 @@ void btck_logging_connection_destroy(btck_LoggingConnection* connection)
787782
delete connection;
788783
}
789784

785+
btck_StringView btck_log_level_get_name(btck_LogLevel level)
786+
{
787+
assert(level < LOG_LEVELS.size());
788+
const auto& name{LOG_LEVELS[level].name};
789+
return {name.data(), name.size()};
790+
}
791+
792+
btck_StringView btck_log_category_get_name(btck_LogCategory category)
793+
{
794+
assert(category < LOG_CATEGORIES.size());
795+
const auto& name{LOG_CATEGORIES[category].name};
796+
return {name.data(), name.size()};
797+
}
798+
790799
btck_ChainParameters* btck_chain_parameters_create(const btck_ChainType chain_type)
791800
{
792801
switch (chain_type) {

src/kernel/bitcoinkernel.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,14 @@ typedef struct btck_Txid btck_Txid;
304304
*/
305305
typedef struct btck_BlockHeader btck_BlockHeader;
306306

307+
/**
308+
* A non-owning view of a string with explicit length.
309+
*/
310+
typedef struct {
311+
const char* data; //!< Pointer to string data (not necessarily null-terminated).
312+
size_t size; //!< Size of the string.
313+
} btck_StringView;
314+
307315
/** Current sync state passed to tip changed callbacks. */
308316
typedef uint8_t btck_SynchronizationState;
309317
#define btck_SynchronizationState_INIT_REINDEX ((btck_SynchronizationState)(0))
@@ -830,6 +838,22 @@ BITCOINKERNEL_API btck_LoggingConnection* BITCOINKERNEL_WARN_UNUSED_RESULT btck_
830838
*/
831839
BITCOINKERNEL_API void btck_logging_connection_destroy(btck_LoggingConnection* logging_connection);
832840

841+
/**
842+
* @brief Get the name of a log level.
843+
*
844+
* @param[in] level The log level.
845+
* @return String name (e.g., "trace", "debug", "info", "warning", "error").
846+
*/
847+
BITCOINKERNEL_API btck_StringView btck_log_level_get_name(btck_LogLevel level);
848+
849+
/**
850+
* @brief Get the name of a log category.
851+
*
852+
* @param[in] category The log category.
853+
* @return String name (e.g., "all", "bench", "validation").
854+
*/
855+
BITCOINKERNEL_API btck_StringView btck_log_category_get_name(btck_LogCategory category);
856+
833857
///@}
834858

835859
/** @name ChainParameters

src/kernel/bitcoinkernel_wrapper.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,18 @@ inline void logging_disable_category(LogCategory category)
830830
btck_logging_disable_category(static_cast<btck_LogCategory>(category));
831831
}
832832

833+
inline std::string_view log_level_get_name(LogLevel level)
834+
{
835+
auto name{btck_log_level_get_name(static_cast<btck_LogLevel>(level))};
836+
return {name.data, name.size};
837+
}
838+
839+
inline std::string_view log_category_get_name(LogCategory category)
840+
{
841+
auto name{btck_log_category_get_name(static_cast<btck_LogCategory>(category))};
842+
return {name.data, name.size};
843+
}
844+
833845
template <typename T>
834846
concept Log = requires(T a, std::string_view message) {
835847
{ a.LogMessage(message) } -> std::same_as<void>;

src/test/kernel/test_kernel.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,28 @@ BOOST_AUTO_TEST_CASE(logging_tests)
635635
Logger logger{std::make_unique<TestLog>()};
636636
}
637637

638+
BOOST_AUTO_TEST_CASE(log_level_name_tests)
639+
{
640+
BOOST_CHECK_EQUAL(log_level_get_name(LogLevel::TRACE_LEVEL), "trace");
641+
BOOST_CHECK_EQUAL(log_level_get_name(LogLevel::DEBUG_LEVEL), "debug");
642+
BOOST_CHECK_EQUAL(log_level_get_name(LogLevel::INFO_LEVEL), "info");
643+
}
644+
645+
BOOST_AUTO_TEST_CASE(log_category_name_tests)
646+
{
647+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::ALL), "all");
648+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::BENCH), "bench");
649+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::BLOCKSTORAGE), "blockstorage");
650+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::COINDB), "coindb");
651+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::KERNEL), "kernel");
652+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::LEVELDB), "leveldb");
653+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::MEMPOOL), "mempool");
654+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::PRUNE), "prune");
655+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::RAND), "rand");
656+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::REINDEX), "reindex");
657+
BOOST_CHECK_EQUAL(log_category_get_name(LogCategory::VALIDATION), "validation");
658+
}
659+
638660
BOOST_AUTO_TEST_CASE(btck_context_tests)
639661
{
640662
{ // test default context

0 commit comments

Comments
 (0)