@xylabs/hex
Version:
Base functionality used throughout XY Labs TypeScript/JavaScript libraries
43 lines (37 loc) • 1.47 kB
text/typescript
import type { AssertConfig } from './assert.ts'
import { assertError } from './assert.ts'
import type { Hex, HexConfig } from './hex/index.ts'
import {
hexFrom, hexFromHexString, isHex,
} from './hex/index.ts'
export type Address = Exclude<Hex, 'reserved-address-value'>
export const toAddress = (value: string | number | bigint | ArrayBufferLike, config: HexConfig = {}) => {
const { bitLength = 160, prefix = false } = config
return hexFrom(value, {
bitLength, prefix, ...config,
})
}
export const isAddress = (value: unknown, config: HexConfig = {}): value is Address => {
const { bitLength = 160, prefix = false } = config
return isHex(value, { bitLength, prefix })
}
export function asAddress(value: unknown): Address | undefined
export function asAddress(value: unknown, assert: AssertConfig): Address
export function asAddress(value: unknown, assert?: AssertConfig): Address | undefined {
try {
let stringValue: string | undefined = undefined
switch (typeof value) {
case 'string': {
stringValue = hexFromHexString(value, { prefix: false })
break
}
default: {
return assert ? assertError(value, assert, `Unsupported type [${typeof value}]`) : undefined
}
}
return isAddress(stringValue) ? stringValue : assertError(value, assert, `Value is not an Address [${value}]`)
} catch (ex) {
const error = ex as Error
return assertError(undefined, assert, error.message)
}
}