on 2d3487f help sign in
bridge/src/form/formatters.ts
106 lines 2.3 kB history raw
1import { compose, strSplice } from 'lib/lib';
2import { convertToInt } from 'lib/convertToInt';
4const HEX_PREFIX = '0x';
5const SIG_PREFIX = '~';
6const TICKET_MAX_BYTE_LEN = 32; // tickets can be as large as 32 bytes
7const PAT_BLOCK_CHAR_LENGTH = 6; // pat{p,q} blocks are 6 characters long
9export const buildFormatter = (formatters = []) =>
10 compose(...formatters.reverse());
12/**
13 * inserts a ~ or - before every pat block
14 */
15export const ensurePatFormat = s => {
16 // bail if falsy or empty string, nothing to do
17 if (!s || s.length === 0) {
18 return s || '';
19 }
21 // ensure there's a dash every 6 + 1 characters
22 const dashAt = i => i * (PAT_BLOCK_CHAR_LENGTH + 1);
23 const maxBlocks = TICKET_MAX_BYTE_LEN / 2;
25 // for every index that may need a separator
26 for (let i = 0; i !== maxBlocks; i++) {
27 const dashIndex = dashAt(i);
29 // if the string is too short to have a separator here, we're done
30 if (s.length - 1 < dashIndex) {
31 return s;
32 }
34 // insert the separator at the correct index if not already there
35 const sep = i === 0 ? '~' : '-';
36 if (s.charAt(dashIndex) !== sep) {
37 s = strSplice(s, dashIndex, sep);
38 }
39 }
41 return s;
42};
44export const ensureHexPrefix = s => {
45 if (!s || s.length < HEX_PREFIX.length) {
46 return s || '';
47 }
49 return s.indexOf(HEX_PREFIX) !== 0 ? `${HEX_PREFIX}${s}` : s;
50};
52export const convertToNumber = s => {
53 if (!s) {
54 return s || '';
55 }
57 try {
58 return convertToInt(s, 10);
59 } catch {
60 return 0;
61 }
62};
64export const downcase = s => {
65 if (!s) {
66 return s;
67 }
69 return s.toLowerCase();
70};
72export const stripHexPrefix = s => {
73 if (!s) {
74 return s;
75 }
77 return s.toLowerCase().indexOf(HEX_PREFIX) === 0
78 ? s.slice(HEX_PREFIX.length)
79 : s;
80};
82export const ensureSigPrefix = s => {
83 if (!s || s.length < SIG_PREFIX.length) {
84 return s || '';
85 }
87 return s.indexOf(SIG_PREFIX) !== 0 ? `${SIG_PREFIX}${s}` : s;
88};
90export const stripSigPrefix = s => {
91 if (!s) {
92 return s;
93 }
95 return s.toLowerCase().indexOf(SIG_PREFIX) === 0
96 ? s.slice(SIG_PREFIX.length)
97 : s;
98};
100export const ticketToSegments = (ticket: string): string[] => {
101 return stripSigPrefix(ticket).split('-');
102};
104export const ticketFromSegments = (segments: string[]): string => {
105 return ensureSigPrefix(segments.join('-'));
106};