proglib
Version:
Многофункциональная библиотека
190 lines (158 loc) • 9.38 kB
JavaScript
'use struct';
const SeparatorsArray = '.';
/**
* Представляет номер версии сборки, операционной системы или среды Node.js.
*/
class Version {
/**
* Инициализирует новый экземпляр класса `Version` с помощью указанных основного и дополнительного номеров версии, номера построения и номера редакции.
* @param {Number} Major Основной номер версии.
* @param {Number} Minor Дополнительный номер версии.
* @param {Number} Build Номер сборки.
* @param {Number} Revision Номер редакции.
*/
constructor(Major, Minor, Build, Revision) {
switch (arguments.length) {
case 0:
this.Major = 0;
this.Minor = 0;
break;
case 1:
if (typeof arguments[0] == 'string') {
let _version = Version.Parse(arguments[0]);
if (_version.Major) this.Major = _version.Major;
if (_version.Minor) this.Minor = _version.Minor;
if (_version.Build) this.Build = _version.Build;
if (_version.Revision) this.Revision = _version.Revision;
}
else { throw new Error('Входные данные заданы неверно.'); }
break;
case 2:
if (typeof arguments[0] == 'number' && typeof arguments[1] == 'number') {
for (let i of arguments)
if (i < 0) throw new Error('Параметры версии должны быть больше или равны нулю.');
this.Major = arguments[0];
this.Minor = arguments[1];
}
else { throw new Error('Входные данные заданы неверно.'); }
break;
case 3:
if (typeof arguments[0] == 'number' && typeof arguments[1] == 'number' && typeof arguments[2] == 'number') {
for (let i of arguments)
if (i < 0) throw new Error('Параметры версии должны быть больше или равны нулю.');
this.Major = arguments[0];
this.Minor = arguments[1];
this.Build = arguments[2];
}
else { throw new Error('Входные данные заданы неверно.'); }
break;
case 4:
if (typeof arguments[0] == 'number' && typeof arguments[1] == 'number' && typeof arguments[2] == 'number' && typeof arguments[3] == 'number') {
for (let i of arguments)
if (i < 0) throw new Error('Параметры версии должны быть больше или равны нулю.');
this.Major = arguments[0];
this.Minor = arguments[1];
this.Build = arguments[2];
this.Revision = arguments[3];
}
else { throw new Error('Входные данные заданы неверно.'); }
break;
default:
throw new Error('Входные данные содержат менее двух или более четырех компонентов версии.');
}
}
/**
* Преобразует строковое представление номера версии в эквивалентный объект `Version`.
* @param {String} Value Строка, содержащая преобразуемый номер версии.
*/
static Parse(Value) {
if (!Value || Value == null)
throw new Error('Входные данные заданы неверно.');
let parsedComponents = Value.split(SeparatorsArray);
let parsedComponentsLength = parsedComponents.length;
for (let i in parsedComponents) {
if (isNaN(Number.parseInt(parsedComponents[i])))
throw new Error('Входные данные заданы неверно.');
else parsedComponents[i] = Number.parseInt(parsedComponents[i]);
}
if ((parsedComponentsLength < 2) || (parsedComponentsLength > 4))
throw new Error('Входные данные содержат менее двух или более четырех компонентов версии.');
return new Version(...parsedComponents);
}
/**
* Сравнивает текущий объект `Version` с указанным объектом `Version` и возвращает сведения об их относительных значениях.
* @param {Version} Value Объект `Version`, сравниваемый с текущим объектом `Version`.
* @returns
* Целое число со знаком, которое определяет относительные значения двух объектов.
* Возвращаемое значение меньше нуля в текущем объекте `Version` указана версия, предшествующая версии, указанной в параметре `Value`.
* Больше нуля в текущем объекте `Version` указана версия, следующая за версией, указанной в параметре `Value`.
*/
CompareTo(Value) {
if (!Value || Value == null)
return 1;
if (this.Major != Value.Major)
return (this.Major > Value.Major) ? 1 : -1;
if (this.Minor != Value.Minor)
return (this.Minor > Value.Minor) ? 1 : -1;
if (this.Build != Value.Build)
return (this.Build > Value.Build) ? 1 : -1;
if (this.Revision != Value.Revision)
return (this.Revision > Value.Revision) ? 1 : -1;
return 0;
}
/**
* Возвращает значение, позволяющее определить, представляют ли текущий объект `Version` и указанный объект `Version` одно и то же значение.
* @param {Version} Value Объект `Version`, сравниваемый с текущим объектом `Version`.
* @returns
* Значение `true`, если все компоненты текущего объекта `Version` совпадают с соответствующими компонентами параметра Value, в противном случае — значение `false`.
*/
Equals(Value) {
if (Value == null)
return false;
if ((this.Major != Value.Major) || (this.Minor != Value.Minor) || (this.Build != Value.Build) || (this.Revision != Value.Revision))
return false;
return true;
}
/**
* Преобразует значение текущего объекта `Version` в объект Json.
*/
toObject() {
let result = { Major: this.Major, Minor: this.Minor, Build: this.Build, Revision: this.Revision }
Object.keys(result).forEach(function(i) { if (!result[i]) delete result[i]; });
return result;
}
/**
* Преобразует значение текущего объекта `Version` в массив.
*/
toArray() {
let result = [ this.Major, this.Minor, this.Build, this.Revision ];
return result.filter(function (el) { return el != undefined; });
}
/**
* Преобразует значение текущего объекта `Version` в эквивалентное ему строчное представление.
*/
toString() {
switch (arguments.length) {
case 0:
return this.toArray().join(SeparatorsArray);
// Значение аргумента должно находиться между 0 и 2.
case 1:
if (typeof arguments[0] == 'number') {
if (arguments[0] >= 0 && arguments[0] <= this.toArray().length) {
return this.toArray().slice(0, arguments[0]).join(SeparatorsArray);
}
else { throw new Error(`Значение аргумента должно находиться между 0 и ${this.toArray().length}.`); }
}
else { throw new Error('Входные данные заданы неверно.'); }
default:
throw new Error('Входные данные заданы неверно.');
}
}
/**
* Возвращает тип для текущего экземпляра.
*/
GetType() {
return 'version';
}
}
module.exports = Version;