#ifndef TILE_BASE_DATA_JSON_H
#define TILE_BASE_DATA_JSON_H

#pragma once

#include "tile/base/internal/meta.h"
#include "tile/base/string.h"
#include "json/json.h"

// #include "inja/inja.h"

namespace tile {

template<typename T>
auto
ToJson(const T &value) -> enable_if_t<std::is_unsigned<T>::value, Json::Value>
{
    return static_cast<std::uint64_t>(value);
}

template<typename T>
auto
ToJson(const T &value) -> enable_if_t<std::is_signed<T>::value, Json::Value>
{
    return static_cast<std::int64_t>(value);
}

template<typename T>
auto
ToJson(const T &value) -> enable_if_t<!std::is_signed<T>::value && !std::is_unsigned<T>::value, Json::Value>
{
    return Format("{}", value);
}

template<typename T>
Json::Value
ToJson(const std::atomic<T> &v)
{
    return ToJson(v.load(std::memory_order_relaxed));
}

}// namespace tile

#endif// TILE_BASE_DATA_JSON_H
