using System.Linq;
using Robust.Shared.Prototypes;
namespace Content.Shared.Prototypes;
public abstract class LocalizedPrototype : IPrototype
{
[IdDataField]
public string ID { get; } = default!;
public const string LocFormat = "{0}-{1}-{2}";
/// The localization string for the name of this prototype
public string NameLoc => ToLocalizationString("name");
/// The localized string for the name of prototype
public string Name => Loc.GetString(NameLoc);
///
/// Returns an Loc string using the as the 'property'.
/// Given `desc` it will return `this-prototype-PrototypeId-desc`.
///
public string ToLocalizationString(string field)
{
// Get the ID of the proto Type
var type =
((PrototypeAttribute?) Attribute.GetCustomAttribute(GetType(), typeof(PrototypeAttribute)))?.Type
?? GetType().Name.Remove(GetType().Name.Length - 9);
// Lowercase the first letter
type = OopsConcat(char.ToLowerInvariant(type[0]).ToString(), type[1..]);
// Replace every uppercase letter with a dash and the lowercase letter
type = type.Aggregate("", (current, c) => current + (char.IsUpper(c) ? OopsConcat("-", char.ToLowerInvariant(c).ToString()) : c.ToString()));
return string.Format(LocFormat, type, ID, field);
}
private static string OopsConcat(string a, string b)
{
// This exists to prevent Roslyn being clever and compiling something that fails sandbox checks.
return a + b;
}
}