/** * Represents the possible configuration values that can be provided when creating the progress bar text. */ interface IProgressBarConfiguration { /** * Current progress, taken as a decimal (i.e. '0.6' to represent '60%') */ progress?: number; /** * Total number of ticks in progress bar. Preferably a factor of 100. */ totalTicks?: number; } /** * Represents concrete configuration values when creating the progress bar text. */ interface IProgressBarConfigurationMaterialized extends IProgressBarConfiguration { progress: number; totalTicks: number; } /** * Creates a graphical "progress bar" * e.g.: [||||---------------] * @param params The configuration parameters for the progress bar */ export function createProgressBarText(params: IProgressBarConfiguration) { // Default values const defaultParams: IProgressBarConfigurationMaterialized = { progress: 0, totalTicks: 20, }; // tslint:disable-next-line:prefer-object-spread const derived: IProgressBarConfigurationMaterialized = Object.assign({}, defaultParams, params); // Ensure it is 0..1 derived.progress = Math.max(Math.min(derived.progress, 1), 0); // This way there is always at least one bar filled in... const bars: number = Math.max(Math.floor(derived.progress / (1 / derived.totalTicks)), 1); const dashes: number = Math.max(derived.totalTicks - bars, 0); // String.prototype.repeat isn't completley supported, but good enough for our purposes return `[${"|".repeat(bars)}${"-".repeat(dashes)}]`; }