using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using RhythmBase.Components;
using RhythmBase.Converters;
using RhythmBase.Events;
using RhythmBase.Exceptions;
using RhythmBase.Settings;
namespace RhythmBase.Utils
{
///
/// Static class providing utility methods.
///
public static class Utils
{
///
/// Converts Xs patterns to string form.
///
/// List of patterns.
/// String representation of patterns.
public static string GetPatternString(Patterns[] pattern) => string.Join("",
pattern?.Select(p => p switch
{
Patterns.None => "-",
Patterns.X => "x",
Patterns.Up => "u",
Patterns.Down => "d",
Patterns.Banana => "b",
Patterns.Return => "r",
_ => throw new ConvertingException($"Invalid pattern: {p}")
}) ?? throw new ConvertingException($"Cannot write pattern."));
///
/// Gets the JSON serializer settings for the specified level and settings.
///
/// The level to serialize.
/// The settings for reading or writing the level.
/// JSON serializer settings.
public static JsonSerializerSettings GetSerializer(this RDLevel rdlevel, LevelReadOrWriteSettings settings)
{
JsonSerializerSettings EventsSerializer = new()
{
ContractResolver = new RDContractResolver()
};
IList converters = EventsSerializer.Converters;
converters.Add(new PanelColorConverter(rdlevel.ColorPalette));
converters.Add(new ColorConverter());
converters.Add(new ConditionalConverter());
converters.Add(new CharacterConverter());
converters.Add(new ConditionConverter(rdlevel.Conditionals));
converters.Add(new TagActionConverter(rdlevel, settings));
converters.Add(new CustomDecorationEventConverter(rdlevel, settings));
converters.Add(new CustomRowEventConverter(rdlevel, settings));
converters.Add(new CustomEventConverter(rdlevel, settings));
converters.Add(new BaseRowActionConverter(rdlevel, settings));
converters.Add(new BaseDecorationActionConverter(rdlevel, settings));
converters.Add(new BaseEventConverter(rdlevel, settings));
converters.Add(new BookmarkConverter(rdlevel.Calculator));
converters.Add(new StringEnumConverter());
return EventsSerializer;
}
///
/// The default beats per minute.
///
public const float DefaultBPM = 100f;
///
/// The default crotchets per bar.
///
public const int DefaultCPB = 8;
}
}