using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GamecraftModdingAPI.Utility
{
///
/// Utility class to access Gamecraft's built-in logging capabilities.
/// The log is saved to %APPDATA%\..\LocalLow\FreeJam\Gamecraft\Player.Log
///
public static class Logging
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Log(string msg)
{
Svelto.Console.Log(msg);
}
///
/// Write a regular message to Gamecraft's log
///
/// The object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Log(object obj)
{
Svelto.Console.Log(obj.ToString());
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogDebug(string msg)
{
Svelto.Console.LogDebug(msg);
}
///
/// Write a debug message to Gamecraft's log
///
/// The object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogDebug(object obj)
{
Svelto.Console.LogDebug(obj.ToString());
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogDebug(string msg, T extraDebug)
{
Svelto.Console.LogDebug(msg, extraDebug);
}
///
/// Write a debug message and object to Gamecraft's log
/// The reason this method exists in Svelto.Console is beyond my understanding
///
/// The type of the extra debug object
/// The object to log
/// The extra object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogDebug(object obj, T extraDebug)
{
Svelto.Console.LogDebug(obj.ToString(), extraDebug);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogError(string msg, Dictionary extraData = null)
{
Svelto.Console.LogError(msg, extraData);
}
///
/// Write an error message to Gamecraft's log
///
/// The object to log
/// The extra data to pass to the ILogger
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogError(object obj, Dictionary extraData = null)
{
Svelto.Console.LogError(obj.ToString(), extraData);
}
///
/// Write an exception to Gamecraft's log
///
/// The exception to log
/// The extra data to pass to the ILogger.
/// This is automatically populated with "OuterException#" and "OuterStacktrace#" entries
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogException(Exception e, string msg = null, Dictionary extraData = null)
{
Svelto.Console.LogException(e, msg, extraData);
}
///
/// Write an exception message to Gamecraft's log
///
/// The object to log
/// The exception to log
/// The extra data to pass to the ILogger.
/// This is implemented similar to LogException(Exception e, Dictionary extraData)'s extraData
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogException(Exception e, object obj, Dictionary extraData = null)
{
Svelto.Console.LogException(e, obj.ToString(), extraData);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogWarning(string msg)
{
Svelto.Console.LogWarning(msg);
}
///
/// Write a warning message to Gamecraft's log
///
/// The object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void LogWarning(object obj)
{
Svelto.Console.LogWarning(obj.ToString());
}
[Obsolete("SystemLog was removed from Svelto.Common")]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SystemLog(string msg)
{
Svelto.Console.Log(msg);
}
///
/// Write a message to stdout (ie the terminal, like Command Prompt or PowerShell)
///
/// The object to log
[Obsolete("SystemLog was removed from Svelto.Common")]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SystemLog(object obj)
{
Svelto.Console.Log(obj.ToString());
}
// descriptive logging
///
/// Write a descriptive message to Gamecraft's log only when the API is a Debug build
///
/// The object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void MetaDebugLog(object obj)
{
#if DEBUG
MetaLog($"[MetaDebug]{obj.ToString()}");
#endif
}
///
/// Write a descriptive message to Gamecraft's log including the current time and the calling method's name
///
/// The object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void MetaLog(object obj)
{
var method = (new StackTrace()).GetFrame(1).GetMethod();
Log($"[{DateTime.Now.ToString()}][{method.DeclaringType.FullName}.{method.Name}]{obj.ToString()}");
}
// CLI logging
///
/// Write a message to Gamecraft's command line
///
/// The object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLog(object obj)
{
CommandLog(obj.ToString());
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLog(string msg)
{
uREPL.Log.Output(msg);
}
///
/// Write an error message to Gamecraft's command line
///
/// The object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLogError(object obj)
{
CommandLogError(obj.ToString());
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLogError(string msg)
{
uREPL.Log.Error(msg);
}
///
/// Write a warning message to Gamecraft's command line
///
/// The object to log
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLogWarning(object obj)
{
CommandLogWarning(obj.ToString());
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void CommandLogWarning(string msg)
{
uREPL.Log.Warn(msg);
}
}
}