UNPKG

data-unit

Version:

Simple TypeScript/ES2017 classes to represent unit values (like time/data size)

107 lines (88 loc) 3.31 kB
import { Amount, UnitKeywords } from './Amount'; export class DataAmountParseError extends Error { } export enum DataUnit { BITS = 0, BYTES = 1, KILOBITS = 2, KILOBYTES = 3, MEGABITS = 4, MEGABYTES = 5, GIGABITS = 6, GIGABYTES = 7, TERABITS = 8, TERABYTES = 9, } export class DataAmount extends Amount<DataUnit, DataAmount> { static pattern = /([0-9]+)(\.[0-9]+)?([KMGkmg][bB]?|[bB])?/; static unitKeywords : UnitKeywords<DataUnit> = { 'b': DataUnit.BITS, 'B': DataUnit.BYTES, 'kb': DataUnit.KILOBYTES, 'kB': DataUnit.KILOBYTES, 'KB': DataUnit.KILOBYTES, 'Kb': DataUnit.KILOBITS, 'mb': DataUnit.MEGABYTES, 'mB': DataUnit.MEGABYTES, 'MB': DataUnit.MEGABYTES, 'Mb': DataUnit.MEGABITS, 'gb': DataUnit.GIGABYTES, 'gB': DataUnit.GIGABYTES, 'GB': DataUnit.GIGABYTES, 'Gb': DataUnit.GIGABITS, 'tb': DataUnit.TERABYTES, 'tB': DataUnit.TERABYTES, 'TB': DataUnit.TERABYTES, 'Tb': DataUnit.TERABITS, }; static isValid ( value : string | number ) { return value && ( typeof value === 'number' || ( typeof value === 'string' && DataAmount.pattern.test( value ) ) ); } static parse ( value : string | number | DataAmount ) : DataAmount { if ( !value ) { throw new DataAmountParseError( `Value is null.` ) } if ( value instanceof DataAmount ) { return value; } else if ( typeof value === 'number' ) { return new DataAmount( value, DataUnit.BYTES ); } else if ( typeof value === 'string' ) { const match = value.match( DataAmount.pattern ); if ( match ) { const unit = DataAmount.unitKeywords[ match[ 3 ] ]; if ( !unit ) { throw new DataAmountParseError( `Data value string has invalid unit: ${ match[ 3 ] }.` ); } return new DataAmount( parseFloat( match[ 1 ] + ( match[ 2 ] || '' ) ), unit ); } else { throw new DataAmountParseError( `Data value string has invalid format.` ); } } else { throw new DataAmountParseError( `Value should be a DataAmount, number or string.` ); } } static tryParse ( value : string | number | DataAmount ) : DataAmount { try { return DataAmount.parse( value ); } catch ( error ) { if ( error instanceof DataAmountParseError ) { return null; } throw error; } } protected exchangeRates = [ { unit: DataUnit.BITS, multiplier : 1 }, { unit: DataUnit.BYTES, multiplier : 8 }, { unit: DataUnit.KILOBITS, multiplier : 125 }, { unit: DataUnit.KILOBYTES, multiplier : 8 }, { unit: DataUnit.MEGABITS, multiplier : 125 }, { unit: DataUnit.MEGABYTES, multiplier : 8 }, { unit: DataUnit.GIGABITS, multiplier : 125 }, { unit: DataUnit.GIGABYTES, multiplier : 8 }, { unit: DataUnit.TERABITS, multiplier : 125 }, { unit: DataUnit.TERABYTES, multiplier : 8 }, ]; unitToString () { return DataUnit[ this.unit ]; } }