You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.7 KiB

import { Service } from '../../../../di/src/decorator/Service.ts'
import { Logging } from '../logging/Logging.ts'
@Service()
export default class Utility {
constructor(
protected logger: Logging
) {}
deep_copy<T>(target: T): T {
if ( target === null )
return target
if ( target instanceof Date )
return new Date(target.getTime()) as any
if ( target instanceof Array ) {
const copy = [] as any[]
(target as any[]).forEach(item => { copy.push(item) })
return copy.map((item: any) => this.deep_copy<any>(item)) as any
}
if ( typeof target === 'object' && target !== {} ) {
const copy = { ...(target as {[key: string]: any }) } as { [key: string]: any }
Object.keys(copy).forEach(key => {
copy[key] = this.deep_copy<any>(copy[key])
})
}
return target
}
// TODO deep_merge
infer(val: string): any {
if ( !val ) return undefined
else if ( val.toLowerCase() === 'true' ) return true
else if ( val.toLowerCase() === 'false' ) return false
else if ( !isNaN(Number(val)) ) return Number(val)
else if ( this.is_json(val) ) return JSON.parse(val)
else if ( val.toLowerCase() === 'null' ) return null
else if ( val.toLowerCase() === 'undefined' ) return undefined
else return val
}
is_json(val: string): boolean {
try {
JSON.parse(val)
return true
} catch(e) {
this.logger.verbose(`Error encountered while checking is_json. Might be invalid. Error: ${e.message}`)
return false
}
}
}