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 { | export function haversineDistance(lat1: number, lon1: number, lat2: number, lon2: number): number { | ||||||
|   const rlat1 = lat1 * Math.PI / 180; |   const rlat1 = lat1 * Math.PI / 180; | ||||||
|   const rlon1 = lon1 * Math.PI / 180; |   const rlon1 = lon1 * Math.PI / 180; | ||||||
| @ -135,4 +136,70 @@ export function haversineDistance(lat1: number, lon1: number, lat2: number, lon2 | |||||||
| 
 | 
 | ||||||
| export function kmToMiles(km: number): number { | export function kmToMiles(km: number): number { | ||||||
|   return km * 0.62137119; |   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