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