(node: Record<string, unknown>, classes: string[])
| 1945 | } |
| 1946 | |
| 1947 | function emitSessionRpcClasses(node: Record<string, unknown>, classes: string[]): string[] { |
| 1948 | const result: string[] = []; |
| 1949 | const groups = Object.entries(node).filter(([, v]) => typeof v === "object" && v !== null && !isRpcMethod(v)); |
| 1950 | const topLevelMethods = Object.entries(node).filter(([, v]) => isRpcMethod(v)); |
| 1951 | |
| 1952 | const srLines = [`/// <summary>Provides typed session-scoped RPC methods.</summary>`, `public sealed class SessionRpc`, `{`, ` private readonly CopilotSession _session;`, ""]; |
| 1953 | srLines.push(` internal SessionRpc(CopilotSession session)`, ` {`, ` _session = session;`); |
| 1954 | srLines.push(` }`); |
| 1955 | srLines.push("", ` internal CopilotSession Session => _session;`); |
| 1956 | for (const [groupName] of groups) { |
| 1957 | const propertyName = toPascalCase(groupName); |
| 1958 | srLines.push( |
| 1959 | "", |
| 1960 | ` /// <summary>${propertyName} APIs.</summary>`, |
| 1961 | ` public ${propertyName}Api ${propertyName} =>`, |
| 1962 | ` field ??`, |
| 1963 | ` Interlocked.CompareExchange(ref field, new(_session), null) ??`, |
| 1964 | ` field;` |
| 1965 | ); |
| 1966 | } |
| 1967 | |
| 1968 | // Emit top-level session RPC methods directly on the SessionRpc class |
| 1969 | const topLevelLines: string[] = []; |
| 1970 | for (const [key, value] of topLevelMethods) { |
| 1971 | emitSessionMethod(key, value as RpcMethod, topLevelLines, classes, " ", false, false); |
| 1972 | } |
| 1973 | srLines.push(...topLevelLines); |
| 1974 | |
| 1975 | srLines.push(`}`); |
| 1976 | result.push(srLines.join("\n")); |
| 1977 | |
| 1978 | for (const [groupName, groupNode] of groups) { |
| 1979 | result.push(...emitSessionApiClass(`${toPascalCase(groupName)}Api`, groupNode as Record<string, unknown>, classes)); |
| 1980 | } |
| 1981 | return result; |
| 1982 | } |
| 1983 | |
| 1984 | function emitSessionMethod(key: string, method: RpcMethod, lines: string[], classes: string[], indent: string, groupExperimental: boolean, groupDeprecated: boolean): void { |
| 1985 | const methodName = toPascalCase(key); |
no test coverage detected
searching dependent graphs…