-
Notifications
You must be signed in to change notification settings - Fork 180
/
createCast.ts
62 lines (50 loc) · 1.62 KB
/
createCast.ts
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import type { MigrationOptions } from '../../types';
import type { Name, Reversible } from '../generalTypes';
import type { DropCastOptions } from './dropCast';
import { dropCast } from './dropCast';
export interface CreateCastWithFunctionOptions {
functionName: Name;
argumentTypes?: string[];
inout?: undefined;
}
export interface CreateCastWithoutFunctionOptions {
functionName?: undefined;
argumentTypes?: undefined;
inout?: undefined;
}
export interface CreateCastWithInoutOptions {
functionName?: undefined;
argumentTypes?: undefined;
inout: boolean;
}
export type CreateCastOptions = (
| CreateCastWithFunctionOptions
| CreateCastWithoutFunctionOptions
| CreateCastWithInoutOptions
) & {
as?: 'ASSIGNMENT' | 'IMPLICIT';
};
export type CreateCastFn = (
fromType: string,
toType: string,
options: CreateCastOptions & DropCastOptions
) => string;
export type CreateCast = Reversible<CreateCastFn>;
export function createCast(mOptions: MigrationOptions): CreateCast {
const _create: CreateCast = (sourceType, targetType, options = {}) => {
const { functionName, argumentTypes, inout = false, as } = options;
let conversion = '';
if (functionName) {
const args = argumentTypes || [sourceType];
conversion = ` WITH FUNCTION ${mOptions.literal(functionName)}(${args.join(', ')})`;
} else if (inout) {
conversion = ' WITH INOUT';
} else {
conversion = ' WITHOUT FUNCTION';
}
const implicit = as ? ` AS ${as}` : '';
return `CREATE CAST (${sourceType} AS ${targetType})${conversion}${implicit};`;
};
_create.reverse = dropCast(mOptions);
return _create;
}