on 115c41e help sign in
bridge/src/form/formatters.js
74 lines 1.7 kB history raw
1import { compose, strSplice } from 'lib/lib';
3const HEX_PREFIX = '0x';
4const TICKET_MAX_BYTE_LEN = 32; // tickets can be as large as 32 bytes
5const PAT_BLOCK_CHAR_LENGTH = 6; // pat{p,q} blocks are 6 characters long
7export const buildFormatter = (formatters = []) =>
8 compose(...formatters.reverse());
10/**
11 * inserts a ~ or - before every pat block
12 */
13export const ensurePatFormat = s => {
14 // bail if falsy or empty string, nothing to do
15 if (!s || s.length === 0) {
16 return s || '';
17 }
19 // ensure there's a dash every 6 + 1 characters
20 const dashAt = i => i * (PAT_BLOCK_CHAR_LENGTH + 1);
21 const maxBlocks = TICKET_MAX_BYTE_LEN / 2;
23 // for every index that may need a separator
24 for (let i = 0; i !== maxBlocks; i++) {
25 const dashIndex = dashAt(i);
27 // if the string is too short to have a separator here, we're done
28 if (s.length - 1 < dashIndex) {
29 return s;
30 }
32 // insert the separator at the correct index if not already there
33 const sep = i === 0 ? '~' : '-';
34 if (s.charAt(dashIndex) !== sep) {
35 s = strSplice(s, dashIndex, sep);
36 }
37 }
39 return s;
40};
42export const ensureHexPrefix = s => {
43 if (!s || s.length < HEX_PREFIX.length) {
44 return s || '';
45 }
47 return s.indexOf(HEX_PREFIX) !== 0 ? `${HEX_PREFIX}${s}` : s;
48};
50export const convertToNumber = s => {
51 try {
52 return parseInt(s, 10);
53 } catch {
54 return 0;
55 }
56};
58export const downcase = s => {
59 if (!s) {
60 return s;
61 }
63 return s.toLowerCase();
64};
66export const stripHexPrefix = s => {
67 if (!s) {
68 return s;
69 }
71 return s.toLowerCase().indexOf(HEX_PREFIX) === 0
72 ? s.slice(HEX_PREFIX.length)
73 : s;
74};