Feature: Readable RegExp constructor
This commit is contained in:
parent
f9aa1b5b35
commit
1339b98281
@ -119,6 +119,7 @@ export function convertRegion(input, to: 'name' | 'abbreviated'): string {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export function haversineDistance(lat1: number, lon1: number, lat2: number, lon2: number): number {
|
||||
const rlat1 = lat1 * Math.PI / 180;
|
||||
const rlon1 = lon1 * Math.PI / 180;
|
||||
@ -136,3 +137,69 @@ export function haversineDistance(lat1: number, lon1: number, lat2: number, lon2
|
||||
export function kmToMiles(km: number): number {
|
||||
return km * 0.62137119;
|
||||
}
|
||||
|
||||
// all base58 characters
|
||||
const BASE58_CHARS = '[a-km-zA-HJ-NP-Z1-9]';
|
||||
// all bech32 characters (after the separator)
|
||||
const BECH32_CHARS = '[ac-hj-np-z02-9]';
|
||||
// All characters usable in bech32 human readable portion (before the 1 separator)
|
||||
// Note: Technically the spec says "all US ASCII characters" but in practice only alphabet is used.
|
||||
// Note: If HRP contains the separator (1) then the separator is "the last instance of separator"
|
||||
const BECH32_HRP_CHARS = '[a-zA-Z0-9]';
|
||||
// Hex characters
|
||||
const HEX_CHARS = '[a-fA-F0-9]';
|
||||
// A regex to say "A single 0 OR any number with no leading zeroes"
|
||||
// (?: // Start a non-capturing group
|
||||
// 0 // A single 0
|
||||
// | // OR
|
||||
// [1-9][0-9]* // Any succession of numbers starting with 1-9
|
||||
// ) // End the non-capturing group.
|
||||
const ZERO_INDEX_NUMBER_CHARS = '(?:0|[1-9][0-9]*)';
|
||||
export type RegexType = 'address' | 'blockhash' | 'transaction' | 'blockheight';
|
||||
export type Network = 'testnet' | 'signet' | 'liquid' | 'bisq' | 'mainnet';
|
||||
export function getRegex(type: RegexType, network: Network): RegExp {
|
||||
let regex = '^'; // ^ = Start of string
|
||||
switch (type) {
|
||||
// Match a block height number
|
||||
// [Testing Order]: any order is fine
|
||||
case 'blockheight':
|
||||
regex += ZERO_INDEX_NUMBER_CHARS; // block height is a 0 indexed number
|
||||
break;
|
||||
// Match a 32 byte block hash in hex. Assumes at least 32 bits of difficulty.
|
||||
// [Testing Order]: Must always be tested before 'transaction'
|
||||
case 'blockhash':
|
||||
regex += '0{8}'; // Starts with exactly 8 zeroes in a row
|
||||
regex += `${HEX_CHARS}{56}`; // Continues with exactly 56 hex letters/numbers
|
||||
break;
|
||||
// Match a 32 byte tx hash in hex. Contains optional output index specifier.
|
||||
// [Testing Order]: Must always be tested after 'blockhash'
|
||||
case 'transaction':
|
||||
regex += `${HEX_CHARS}{64}`; // Exactly 64 hex letters/numbers
|
||||
regex += '(?:'; // Start a non-capturing group
|
||||
regex += ':'; // 1 instances of the symbol ":"
|
||||
regex += ZERO_INDEX_NUMBER_CHARS; // A zero indexed number
|
||||
regex += ')?'; // End the non-capturing group. This group appears 0 or 1 times
|
||||
break;
|
||||
case 'address':
|
||||
// TODO
|
||||
switch (network) {
|
||||
case 'mainnet':
|
||||
break;
|
||||
case 'testnet':
|
||||
break;
|
||||
case 'signet':
|
||||
break;
|
||||
case 'liquid':
|
||||
break;
|
||||
case 'bisq':
|
||||
break;
|
||||
default:
|
||||
throw new Error('Invalid Network (Unreachable error in TypeScript)');
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new Error('Invalid RegexType (Unreachable error in TypeScript)');
|
||||
}
|
||||
regex += '$'; // $ = End of string
|
||||
return new RegExp(regex);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user