import { ParseRangeResult } from '../interfaces/option-parser';
/**
* Options parser for custom tag
*/
export class OptionParser {
/**
* Parse range expression
*
*
* - ex:
*
* - 1:2 -> { start: 1, end: 2 }
* - 1: -> { start: 1, end: -1 }
* - 2+3 -> { start: 1, end: 5 }
*
*
*
* @see https://regex101.com/r/w4KCwC/4
*
* @static
* @param {string} str
* @returns {ParseRangeResult}
*/
static parseRange(str: string): ParseRangeResult | null {
if (str == null) {
return null;
}
// see: https://regex101.com/r/w4KCwC/4
const match = str.match(/^(-?[0-9]+)(([:+]{1})(-?[0-9]+)?)?$/);
if (!match) {
return null;
}
// determine start
let start;
let end;
// has operator
if (match[3] != null) {
start = +match[1];
const operator = match[3];
// determine end
if (operator === ':') {
end = +match[4] || -1; // set last(-1) if undefined
}
else if (operator === '+') {
end = +match[4] || 0; // plus zero if undefined
end += start;
}
}
// don't have operator
else {
start = 1;
end = +match[1];
}
return { start, end };
}
}