avegao/aws-athena-node-client

View on GitHub
src/Column.ts

Summary

Maintainability
A
25 mins
Test Coverage
import destr from 'destr';

export type ColumnParse = (value: string) => unknown;

export class Column {
    public name: string;
    public parse: (value: string) => unknown;

    public constructor(name: string, parse: ColumnParse) {
        this.name = name;
        this.parse = parse;
    }

    /**
     * Parses string to number
     *
     * @static
     * @param {string} value - string to parse
     * @returns {number} - parsed number
     */
    public static parseNumber(value: string): number {
        const result = Number(value);

        if (Number.isNaN(result)) {
            throw new Error(`The value '${value} 'is not a number`);
        }

        return result;
    }

    /**
     * Parses string
     *
     * @static
     * @param {string} value - string to parse
     * @returns {string} - parsed string
     */
    public static parseString(value: string): string {
        return value;
    }

    /**
     * Parses boolean-like Athena expression to boolean
     *
     * @static
     * @param {string} value - boolean-like string
     * @returns {boolean} - parsed string
     */
    public static parseBoolean(value: string): boolean {
        return (
            value === 'true'
            || value === 'TRUE'
            || value === 't'
            || value === 'T'
            || value === 'yes'
            || value === 'YES'
            || value === '1'
        );
    }

    /**
     * Parses string to date
     *
     * @static
     * @param {string} value - string to parse
     * @returns {Date} - parsed date
     */
    public static parseDate(value: string): Date {
        return new Date(value);
    }

    /**
     * Parses string to array
     *
     * @static
     * @param {string} arrayInString - string to parse
     * @returns {any[]} - parsed array
     */
    public static parseArray(arrayInString: string): number[] | string[] {
        arrayInString = arrayInString.replace(/[\[\]]/gi, '');

        if (arrayInString == null || arrayInString === '') {
            return [];
        }

        const values = arrayInString.split(', ');
        const result: number[] | string[] = [];

        for (const value of values) {
            let numberValue = Number(value);

            if (!Number.isNaN(numberValue)) {
                result.push(numberValue as never);
            } else {
                result.push(value as never);
            }
        }

        return result;
    }

    /**
     * Parses string to array
     *
     * @static
     * @param {string} value - string to parse
     * @returns {any[]} - parsed array
     */
    public static parseJson(value: string): unknown[] {
        return destr(value);
    }
}