1/**
2 * Typed SQL Server stored procedure parameter metadata.
3 *
4 * This module builds {@link Parameter} values that pair a stored procedure
5 * parameter name with a Tedious `DataType`, Tedious `ParameterOptions`, and a
6 * phantom TypeScript value type. `Procedure.param` and
7 * `Procedure.outputParam` use this metadata, and `MssqlClient.call` forwards it
8 * to Tedious when registering input and output parameters.
9 *
10 * @see {@link make} for constructing parameter metadata directly.
11 *
12 * @stability unstable
13 * @since 4.0.0
14 */
15import { identity } from "effect/Function"
16import type { DataType } from "tedious/lib/data-type.ts"
17import type { ParameterOptions } from "tedious/lib/request.ts"
18
19/**
20 * Runtime type identifier used to mark SQL Server stored procedure parameter metadata.
21 *
22 * @stability unstable
23 * @category type IDs
24 * @since 4.0.0
25 */
26export const TypeId: TypeId = "~@effect/sql-mssql/Parameter"
27
28/**
29 * Type-level identifier used to mark SQL Server stored procedure parameter metadata.
30 *
31 * @stability unstable
32 * @category type IDs
33 * @since 4.0.0
34 */
35export type TypeId = "~@effect/sql-mssql/Parameter"
36
37/**
38 * Metadata for a SQL Server stored procedure parameter, including its name, Tedious data type, options, and phantom value type.
39 *
40 * @stability unstable
41 * @category models
42 * @since 4.0.0
43 */
44export interface Parameter<out A> {
45 readonly [TypeId]: (_: never) => A
46 readonly _tag: "Parameter"
47 readonly name: string
48 readonly type: DataType
49 readonly options: ParameterOptions
50}
51
52/**
53 * Creates typed metadata for a SQL Server stored procedure parameter.
54 *
55 * @stability unstable
56 * @category constructors
57 * @since 4.0.0
58 */
59export const make = <A>(
60 name: string,
61 type: DataType,
62 options: ParameterOptions = {}
63): Parameter<A> => ({
64 [TypeId]: identity,
65 _tag: "Parameter",
66 name,
67 type,
68 options
69})