using System.Globalization;
using System.Text.Json;
using XFEEDToolBox.Core.Models;
namespace XFEEDToolBox.Core.Data;
public static class JsonFields
{
public static JsonElement Get(this JsonElement value, string name)
{
if (value.ValueKind != JsonValueKind.Object) return default;
if (value.TryGetProperty(name, out var exact)) return exact;
foreach (var prop in value.EnumerateObject())
if (prop.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) return prop.Value;
return default;
}
public static string Text(this JsonElement value, string name, string fallback = "") => value.Get(name) is var p && p.ValueKind == JsonValueKind.String ? p.GetString() ?? fallback : fallback;
public static long Long(this JsonElement value, string name, long fallback = 0)
{
var p = value.Get(name);
if (p.ValueKind == JsonValueKind.Number && p.TryGetInt64(out var result)) return result;
return p.ValueKind == JsonValueKind.String && long.TryParse(p.GetString(), out result) ? result : fallback;
}
public static double? Number(this JsonElement value, string name)
{
var p = value.Get(name);
return p.ValueKind == JsonValueKind.Number && p.TryGetDouble(out var n) && double.IsFinite(n) ? n : null;
}
public static bool Flag(this JsonElement value, string name) => value.Get(name) is var p && (p.ValueKind == JsonValueKind.True || p.ValueKind == JsonValueKind.Number && p.TryGetInt64(out var n) && n != 0);
public static DateTimeOffset? Time(this JsonElement value, string name = "timestamp") => DateTimeOffset.TryParse(value.Text(name), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var d) ? d : null;
public static IEnumerable<JsonElement> Items(this JsonElement value) => value.ValueKind switch
{
JsonValueKind.Array => value.EnumerateArray(),
JsonValueKind.Object => value.EnumerateObject().Select(p => p.Value),
_ => []
};
public static string CommodityKey(string text)
{
text = text.Trim().Trim('$', ';').ToLowerInvariant();
if (text.EndsWith("_name", StringComparison.Ordinal)) text = text[..^5];
return string.Concat(text.Where(char.IsLetterOrDigit));
}
public static Coordinates? Position(this JsonElement value, string name = "StarPos")
{
var p = value.Get(name);
if (p.ValueKind == JsonValueKind.Array && p.GetArrayLength() == 3 && p[0].TryGetDouble(out var x) && p[1].TryGetDouble(out var y) && p[2].TryGetDouble(out var z))
{
var result = new Coordinates(x, y, z);
return result.IsValid ? result : null;
}
if (p.Number("x") is { } px && p.Number("y") is { } py && p.Number("z") is { } pz) return new(px, py, pz);
return null;
}
public static SecurityLevel Security(string text) => text.ToLowerInvariant() switch
{
var x when x.Contains("high") => SecurityLevel.High,
var x when x.Contains("medium") => SecurityLevel.Medium,
var x when x.Contains("low") => SecurityLevel.Low,
var x when x.Contains("anarchy") || x.Contains("lawless") => SecurityLevel.Anarchy,
_ => SecurityLevel.Unknown
};
public static LandingPad PadFromType(string type) => type.ToLowerInvariant() switch
{
"coriolis" or "orbis" or "ocellus" or "asteroidbase" or "crateroutpost" or "craterport" or "fleetcarrier" => LandingPad.Large,
"outpost" => LandingPad.Medium,
_ => LandingPad.Unknown
};
}
using System.Globalization;
using System.Text.Json;
using XFEEDToolBox.Core.Models;
namespace XFEEDToolBox.Core.Data;
public static class JsonFields
{
public static JsonElement Get(this JsonElement value, string name)
{
if (value.ValueKind != JsonValueKind.Object) return default;
if (value.TryGetProperty(name, out var exact)) return exact;
foreach (var prop in value.EnumerateObject())
if (prop.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) return prop.Value;
return default;
}
public static string Text(this JsonElement value, string name, string fallback = "") => value.Get(name) is var p && p.ValueKind == JsonValueKind.String ? p.GetString() ?? fallback : fallback;
public static long Long(this JsonElement value, string name, long fallback = 0)
{
var p = value.Get(name);
if (p.ValueKind == JsonValueKind.Number && p.TryGetInt64(out var result)) return result;
return p.ValueKind == JsonValueKind.String && long.TryParse(p.GetString(), out result) ? result : fallback;
}
public static double? Number(this JsonElement value, string name)
{
var p = value.Get(name);
return p.ValueKind == JsonValueKind.Number && p.TryGetDouble(out var n) && double.IsFinite(n) ? n : null;
}
public static bool Flag(this JsonElement value, string name) => value.Get(name) is var p && (p.ValueKind == JsonValueKind.True || p.ValueKind == JsonValueKind.Number && p.TryGetInt64(out var n) && n != 0);
public static DateTimeOffset? Time(this JsonElement value, string name = "timestamp") => DateTimeOffset.TryParse(value.Text(name), CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var d) ? d : null;
public static IEnumerable<JsonElement> Items(this JsonElement value) => value.ValueKind switch
{
JsonValueKind.Array => value.EnumerateArray(),
JsonValueKind.Object => value.EnumerateObject().Select(p => p.Value),
_ => []
};
public static string CommodityKey(string text)
{
text = text.Trim().Trim('$', ';').ToLowerInvariant();
if (text.EndsWith("_name", StringComparison.Ordinal)) text = text[..^5];
return string.Concat(text.Where(char.IsLetterOrDigit));
}
public static Coordinates? Position(this JsonElement value, string name = "StarPos")
{
var p = value.Get(name);
if (p.ValueKind == JsonValueKind.Array && p.GetArrayLength() == 3 && p[0].TryGetDouble(out var x) && p[1].TryGetDouble(out var y) && p[2].TryGetDouble(out var z))
{
var result = new Coordinates(x, y, z);
return result.IsValid ? result : null;
}
if (p.Number("x") is { } px && p.Number("y") is { } py && p.Number("z") is { } pz) return new(px, py, pz);
return null;
}
public static SecurityLevel Security(string text) => text.ToLowerInvariant() switch
{
var x when x.Contains("high") => SecurityLevel.High,
var x when x.Contains("medium") => SecurityLevel.Medium,
var x when x.Contains("low") => SecurityLevel.Low,
var x when x.Contains("anarchy") || x.Contains("lawless") => SecurityLevel.Anarchy,
_ => SecurityLevel.Unknown
};
public static LandingPad PadFromType(string type) => type.ToLowerInvariant() switch
{
"coriolis" or "orbis" or "ocellus" or "asteroidbase" or "crateroutpost" or "craterport" or "fleetcarrier" => LandingPad.Large,
"outpost" => LandingPad.Medium,
_ => LandingPad.Unknown
};
}