File size: 1,883 Bytes
aa89cb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
export type Value = 
  | { type: 'Null' }
  | { type: 'Bool', value: boolean }
  | { type: 'I64', value: number }
  | { type: 'U64', value: number }
  | { type: 'F64', value: number }
  | { type: 'Decimal', value: number | string }
  | { type: 'Text', value: string }
  | { type: 'Json', value: any }
  | { type: 'Date', value: string | Date }
  | { type: 'Timestamp', value: number }
  | { type: 'Object', value: Record<string, Value> }
  | { type: 'List', value: Value[] }
  | { type: 'TypedNull', dataType: string };

export const Values = {
  Null: (): Value => ({ type: 'Null' }),
  Bool: (value: boolean): Value => ({ type: 'Bool', value }),
  I64: (value: number): Value => ({ type: 'I64', value }),
  U64: (value: number): Value => ({ type: 'U64', value }),
  F64: (value: number): Value => ({ type: 'F64', value }),
  Decimal: (value: number | string): Value => ({ type: 'Decimal', value }),
  Text: (value: string): Value => ({ type: 'Text', value }),
  Json: (value: any): Value => ({ type: 'Json', value }),
  Date: (value: string | Date): Value => ({ type: 'Date', value }),
  Timestamp: (value: number): Value => ({ type: 'Timestamp', value }),
  Object: (value: Record<string, Value>): Value => ({ type: 'Object', value }),
  List: (value: Value[]): Value => ({ type: 'List', value }),
  TypedNull: (dataType: string): Value => ({ type: 'TypedNull', dataType }),

  isEmpty(v: Value): boolean {
    switch (v.type) {
      case 'Null':
      case 'TypedNull': return true;
      case 'Text': return v.value === '';
      case 'Object': return Object.keys(v.value).length === 0;
      case 'List': return v.value.length === 0;
      default: return false;
    }
  },

  tryI64(v: Value): number | null {
    if (v.type === 'I64' || v.type === 'U64') return Number(v.value);
    if (v.type === 'Decimal') return parseInt(v.value.toString(), 10);
    return null;
  }
};