43 lines
1.5 KiB
C#
43 lines
1.5 KiB
C#
namespace ReleaseUpdater;
|
||
|
||
/// <summary>
|
||
/// Сервис для работы с семантическими версиями.
|
||
/// </summary>
|
||
public sealed class SemVerService
|
||
{
|
||
/// <summary>
|
||
/// Пытается распарсить строку версии в объект <see cref="Version"/>.
|
||
/// </summary>
|
||
/// <param name="version">Строка версии (например, "3.5.2").</param>
|
||
/// <param name="parsed">Результат парсинга.</param>
|
||
/// <returns>true, если парсинг успешен.</returns>
|
||
public bool TryParse(string version, out Version parsed)
|
||
{
|
||
var v = version.Trim().TrimStart('v');
|
||
return Version.TryParse(Normalize(v), out parsed);
|
||
|
||
static string Normalize(string v)
|
||
{
|
||
var parts = v.Split('.', StringSplitOptions.RemoveEmptyEntries);
|
||
return parts.Length switch
|
||
{
|
||
1 => $"{parts[0]}.0.0",
|
||
2 => $"{parts[0]}.{parts[1]}.0",
|
||
_ => $"{parts[0]}.{parts[1]}.{parts[2]}"
|
||
};
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Сравнивает две версии.
|
||
/// </summary>
|
||
/// <param name="v1">Первая версия.</param>
|
||
/// <param name="v2">Вторая версия.</param>
|
||
/// <returns>-1 если v1 < v2, 0 если равны, 1 если v1 > v2.</returns>
|
||
public int Compare(string v1, string v2)
|
||
{
|
||
TryParse(v1, out var a);
|
||
TryParse(v2, out var b);
|
||
return a.CompareTo(b);
|
||
}
|
||
} |