typespec-rust-emitter 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/AGENTS.md +83 -79
  2. package/CHANGELOG.md +60 -0
  3. package/dist/src/decorators/cache_control.d.ts +6 -0
  4. package/dist/src/decorators/cache_control.js +9 -0
  5. package/dist/src/decorators/cache_control.js.map +1 -0
  6. package/dist/src/decorators/etag_cache.d.ts +6 -0
  7. package/dist/src/decorators/etag_cache.js +9 -0
  8. package/dist/src/decorators/etag_cache.js.map +1 -0
  9. package/dist/src/decorators/index.d.ts +6 -0
  10. package/dist/src/decorators/index.js +7 -0
  11. package/dist/src/decorators/index.js.map +1 -0
  12. package/dist/src/decorators/rust_attr.d.ts +3 -0
  13. package/dist/src/decorators/rust_attr.js +45 -0
  14. package/dist/src/decorators/rust_attr.js.map +1 -0
  15. package/dist/src/decorators/rust_derive.d.ts +3 -0
  16. package/dist/src/decorators/rust_derive.js +39 -0
  17. package/dist/src/decorators/rust_derive.js.map +1 -0
  18. package/dist/src/decorators/rust_impl.d.ts +2 -0
  19. package/dist/src/decorators/rust_impl.js +19 -0
  20. package/dist/src/decorators/rust_impl.js.map +1 -0
  21. package/dist/src/decorators/rust_self.d.ts +3 -0
  22. package/dist/src/decorators/rust_self.js +35 -0
  23. package/dist/src/decorators/rust_self.js.map +1 -0
  24. package/dist/src/emitter.d.ts +2 -11
  25. package/dist/src/emitter.js +7 -1252
  26. package/dist/src/emitter.js.map +1 -1
  27. package/dist/src/formatter/index.d.ts +2 -0
  28. package/dist/src/formatter/index.js +3 -0
  29. package/dist/src/formatter/index.js.map +1 -0
  30. package/dist/src/formatter/mappings.d.ts +4 -0
  31. package/dist/src/formatter/mappings.js +68 -0
  32. package/dist/src/formatter/mappings.js.map +1 -0
  33. package/dist/src/formatter/strings.d.ts +4 -0
  34. package/dist/src/formatter/strings.js +32 -0
  35. package/dist/src/formatter/strings.js.map +1 -0
  36. package/dist/src/generator/etag_router.d.ts +30 -0
  37. package/dist/src/generator/etag_router.js +123 -0
  38. package/dist/src/generator/etag_router.js.map +1 -0
  39. package/dist/src/generator/index.d.ts +5 -0
  40. package/dist/src/generator/index.js +6 -0
  41. package/dist/src/generator/index.js.map +1 -0
  42. package/dist/src/generator/response_enums.d.ts +6 -0
  43. package/dist/src/generator/response_enums.js +58 -0
  44. package/dist/src/generator/response_enums.js.map +1 -0
  45. package/dist/src/generator/router.d.ts +7 -0
  46. package/dist/src/generator/router.js +227 -0
  47. package/dist/src/generator/router.js.map +1 -0
  48. package/dist/src/generator/server_trait.d.ts +6 -0
  49. package/dist/src/generator/server_trait.js +97 -0
  50. package/dist/src/generator/server_trait.js.map +1 -0
  51. package/dist/src/generator/types_file.d.ts +11 -0
  52. package/dist/src/generator/types_file.js +209 -0
  53. package/dist/src/generator/types_file.js.map +1 -0
  54. package/dist/src/index.d.ts +1 -1
  55. package/dist/src/index.js +1 -1
  56. package/dist/src/index.js.map +1 -1
  57. package/dist/src/lib.js +1 -1
  58. package/dist/src/lib.js.map +1 -1
  59. package/dist/src/models/index.d.ts +2 -0
  60. package/dist/src/models/index.js +3 -0
  61. package/dist/src/models/index.js.map +1 -0
  62. package/dist/src/models/keys.d.ts +6 -0
  63. package/dist/src/models/keys.js +8 -0
  64. package/dist/src/models/keys.js.map +1 -0
  65. package/dist/src/models/types.d.ts +45 -0
  66. package/dist/src/models/types.js +2 -0
  67. package/dist/src/models/types.js.map +1 -0
  68. package/dist/src/parser/decorators.d.ts +18 -0
  69. package/dist/src/parser/decorators.js +28 -0
  70. package/dist/src/parser/decorators.js.map +1 -0
  71. package/dist/src/parser/index.d.ts +6 -0
  72. package/dist/src/parser/index.js +7 -0
  73. package/dist/src/parser/index.js.map +1 -0
  74. package/dist/src/parser/operations.d.ts +13 -0
  75. package/dist/src/parser/operations.js +127 -0
  76. package/dist/src/parser/operations.js.map +1 -0
  77. package/dist/src/parser/parameters.d.ts +5 -0
  78. package/dist/src/parser/parameters.js +98 -0
  79. package/dist/src/parser/parameters.js.map +1 -0
  80. package/dist/src/parser/responses.d.ts +13 -0
  81. package/dist/src/parser/responses.js +132 -0
  82. package/dist/src/parser/responses.js.map +1 -0
  83. package/dist/src/parser/routes.d.ts +4 -0
  84. package/dist/src/parser/routes.js +36 -0
  85. package/dist/src/parser/routes.js.map +1 -0
  86. package/dist/src/parser/types.d.ts +9 -0
  87. package/dist/src/parser/types.js +157 -0
  88. package/dist/src/parser/types.js.map +1 -0
  89. package/dist/test/etag_cache.test.d.ts +1 -0
  90. package/dist/test/etag_cache.test.js +62 -0
  91. package/dist/test/etag_cache.test.js.map +1 -0
  92. package/dist/test/hello.test.js +23 -0
  93. package/dist/test/hello.test.js.map +1 -1
  94. package/dist/test/test-host.d.ts +11 -0
  95. package/dist/test/test-host.js +28 -0
  96. package/dist/test/test-host.js.map +1 -1
  97. package/example/main.tsp +48 -1
  98. package/example/output-rust/Cargo.lock +75 -0
  99. package/example/output-rust/Cargo.toml +2 -1
  100. package/example/output-rust/src/generated/server.rs +163 -12
  101. package/example/output-rust/src/generated/types.rs +8 -0
  102. package/example/output-rust/src/main.rs +75 -27
  103. package/justfile +31 -2
  104. package/package.json +1 -1
  105. package/scripts/update-golden.js +36 -0
  106. package/src/decorators/cache_control.ts +14 -0
  107. package/src/decorators/etag_cache.ts +14 -0
  108. package/src/decorators/index.ts +6 -0
  109. package/src/decorators/rust_attr.ts +61 -0
  110. package/src/decorators/rust_derive.ts +55 -0
  111. package/src/decorators/rust_impl.ts +29 -0
  112. package/src/decorators/rust_self.ts +42 -0
  113. package/src/emitter.ts +18 -1623
  114. package/src/formatter/index.ts +2 -0
  115. package/src/formatter/mappings.ts +70 -0
  116. package/src/formatter/strings.ts +33 -0
  117. package/src/generator/etag_router.ts +147 -0
  118. package/src/generator/index.ts +5 -0
  119. package/src/generator/response_enums.ts +76 -0
  120. package/src/generator/router.ts +280 -0
  121. package/src/generator/server_trait.ts +134 -0
  122. package/src/generator/types_file.ts +297 -0
  123. package/src/index.ts +3 -1
  124. package/src/lib.ts +1 -1
  125. package/src/lib.tsp +3 -1
  126. package/src/models/index.ts +2 -0
  127. package/src/models/keys.ts +7 -0
  128. package/src/models/types.ts +54 -0
  129. package/src/parser/decorators.ts +34 -0
  130. package/src/parser/index.ts +6 -0
  131. package/src/parser/operations.ts +158 -0
  132. package/src/parser/parameters.ts +117 -0
  133. package/src/parser/responses.ts +170 -0
  134. package/src/parser/routes.ts +47 -0
  135. package/src/parser/types.ts +215 -0
  136. package/test/etag_cache.test.ts +69 -0
  137. package/test/golden/etag_cache/server.rs +109 -0
  138. package/test/golden/etag_cache/spec.tsp +20 -0
  139. package/test/golden/etag_cache/types.rs +13 -0
  140. package/test/hello.test.ts +24 -0
  141. package/test/test-host.ts +43 -0
@@ -0,0 +1,227 @@
1
+ import { toPascalCase, toRustIdent } from "../formatter/strings.js";
2
+ import { emitOperationInfo, hasAuthDecorator, getSelfReceiver, hasEtagCache, } from "../parser/operations.js";
3
+ import { getFullRoute } from "../parser/routes.js";
4
+ import { getRustTypeForProperty } from "../parser/types.js";
5
+ import { hasMultipartBody } from "../parser/parameters.js";
6
+ import { generateEtagHandler } from "./etag_router.js";
7
+ export function generateRouter(program, namespaceGroups, anonymousEnums) {
8
+ const handlers = [];
9
+ const queryTypeStructs = [];
10
+ const publicRoutes = [];
11
+ const protectedRoutes = [];
12
+ const usedMethods = new Set();
13
+ const hasEtag = namespaceGroups.some((g) => g.operations.some((o) => hasEtagCache(program, o)));
14
+ for (const group of namespaceGroups) {
15
+ const nsRoute = getFullRoute(program, group.namespace);
16
+ if (!nsRoute)
17
+ continue;
18
+ const nsName = toPascalCase(group.namespace.name.replace(/[^a-zA-Z0-9_]/g, "_"));
19
+ for (const op of group.operations) {
20
+ const opInfo = emitOperationInfo(program, op, nsRoute, anonymousEnums);
21
+ if (!opInfo)
22
+ continue;
23
+ const method = opInfo.method.toLowerCase();
24
+ usedMethods.add(method);
25
+ const handlerFnName = toRustIdent(`${nsName}_${opInfo.name}`);
26
+ const traitFnName = handlerFnName;
27
+ const isProtected = hasAuthDecorator(op);
28
+ const selfReceiver = getSelfReceiver(op);
29
+ const pathParams = opInfo.parameters.filter((p) => p.location === "path");
30
+ const hasPathParams = pathParams.length > 0;
31
+ const queryParams = opInfo.parameters.filter((p) => p.location === "query");
32
+ const hasQueryParams = queryParams.length > 0;
33
+ const hasBody = !!opInfo.body;
34
+ const isMultipartBody = hasMultipartBody(op);
35
+ const extractorLines = [];
36
+ const serverArgs = [];
37
+ const serviceBinding = selfReceiver === "&mut self" ? "mut service" : "service";
38
+ if (isProtected) {
39
+ extractorLines.push(` Extension(claims): Extension<S::Claims>,`);
40
+ serverArgs.push(`claims`);
41
+ }
42
+ if (hasPathParams) {
43
+ const pathTypes = pathParams.map((p) => p.rustType).join(", ");
44
+ const pathFields = pathParams.map((p) => p.rustName).join(", ");
45
+ if (pathParams.length === 1) {
46
+ extractorLines.push(` Path(${pathFields}): Path<${pathTypes}>,`);
47
+ }
48
+ else {
49
+ extractorLines.push(` Path((${pathFields})): Path<(${pathTypes})>,`);
50
+ }
51
+ for (const param of pathParams) {
52
+ serverArgs.push(param.rustName);
53
+ }
54
+ }
55
+ if (hasQueryParams && queryParams.length > 0) {
56
+ const queryTypeName = `${toPascalCase(handlerFnName)}Query`;
57
+ const queryFields = queryParams
58
+ .map((p) => ` #[serde(rename = "${p.name}")]\n pub ${p.rustName}: ${p.rustType}`)
59
+ .join(",\n");
60
+ queryTypeStructs.push(`#[derive(Debug, Clone, serde::Deserialize)]\npub struct ${queryTypeName} {\n${queryFields}\n}`);
61
+ extractorLines.push(` Query(params): Query<${queryTypeName}>,`);
62
+ for (const param of queryParams) {
63
+ serverArgs.push(`params.${param.rustName}`);
64
+ }
65
+ }
66
+ if (hasBody && opInfo.body) {
67
+ if (isMultipartBody) {
68
+ extractorLines.push(` multipart: axum::extract::Multipart,`);
69
+ serverArgs.push(`multipart`);
70
+ }
71
+ else {
72
+ const bodyType = getRustTypeForProperty(opInfo.body.type, program, anonymousEnums);
73
+ extractorLines.push(` Json(payload): Json<${bodyType.type}>,`);
74
+ serverArgs.push(`payload`);
75
+ }
76
+ }
77
+ const serverArgsStr = serverArgs.join(", ");
78
+ if (hasEtagCache(program, op)) {
79
+ const cacheKey = `${handlerFnName}:${pathParams.map((p) => `{${p.rustName}}`).join(":")}`;
80
+ const code = generateEtagHandler({
81
+ handlerFnName,
82
+ cacheKey,
83
+ pathParams,
84
+ serverArgsStr,
85
+ responseName: `${nsName}${toPascalCase(opInfo.name)}Response`,
86
+ etagKey: opInfo.etagKey,
87
+ cacheControl: opInfo.cacheControl,
88
+ });
89
+ handlers.push(code);
90
+ const routePath = `"${opInfo.path}"`;
91
+ const routeStmt = `.route(${routePath}, ${method}(${handlerFnName}_handler::<S, C>))`;
92
+ if (isProtected) {
93
+ protectedRoutes.push(routeStmt);
94
+ }
95
+ else {
96
+ publicRoutes.push(routeStmt);
97
+ }
98
+ continue;
99
+ }
100
+ const serverCall = `service.${traitFnName}(${serverArgsStr}).await`;
101
+ let responseHandling = opInfo.cacheControl
102
+ ? `match result {
103
+ Ok(response) => {
104
+ let mut res = response.into_response();
105
+ res.headers_mut().insert(
106
+ axum::http::header::CACHE_CONTROL,
107
+ axum::http::HeaderValue::from_static("${opInfo.cacheControl}"),
108
+ );
109
+ res
110
+ }
111
+ Err(e) => (
112
+ axum::http::StatusCode::INTERNAL_SERVER_ERROR,
113
+ format!("Internal error: {e}"),
114
+ )
115
+ .into_response(),
116
+ }`
117
+ : `match result {
118
+ Ok(response) => response.into_response(),
119
+ Err(e) => (
120
+ axum::http::StatusCode::INTERNAL_SERVER_ERROR,
121
+ format!("Internal error: {e}"),
122
+ )
123
+ .into_response(),
124
+ }`;
125
+ const needsClone = selfReceiver !== "self" ? "+ Clone" : "";
126
+ const handlerCode = selfReceiver === "self"
127
+ ? `// NOTE: ${handlerFnName} takes self and cannot be used with the router pattern.
128
+ // It consumes the service, so you need to implement your own handler pattern.
129
+ pub async fn ${handlerFnName}_handler<S>(
130
+ axum::extract::State(service): axum::extract::State<S>,
131
+ ${extractorLines.join("\n")}
132
+ ) -> impl axum::response::IntoResponse
133
+ where
134
+ S: Server + Send + Sync + 'static,
135
+ S::Claims: Send + Sync + Clone + 'static,
136
+ {
137
+ let result = service.${traitFnName}(${serverArgsStr}).await;
138
+ ${responseHandling}
139
+ }`
140
+ : `pub async fn ${handlerFnName}_handler<S>(
141
+ axum::extract::State(${serviceBinding}): axum::extract::State<S>,
142
+ ${extractorLines.join("\n")}
143
+ ) -> impl axum::response::IntoResponse
144
+ where
145
+ S: Server${needsClone} + Send + Sync + 'static,
146
+ S::Claims: Send + Sync + Clone + 'static,
147
+ {
148
+ let result = ${serverCall};
149
+ ${responseHandling}
150
+ }`;
151
+ handlers.push(handlerCode);
152
+ if (selfReceiver === "self") {
153
+ continue;
154
+ }
155
+ const routePath = `"${opInfo.path}"`;
156
+ let routeStmt = "";
157
+ if (isProtected) {
158
+ routeStmt = `.route(${routePath}, ${method}(${handlerFnName}_handler::<S>))`;
159
+ protectedRoutes.push(routeStmt);
160
+ }
161
+ else {
162
+ routeStmt = `.route(${routePath}, ${method}(${handlerFnName}_handler::<S>))`;
163
+ publicRoutes.push(routeStmt);
164
+ }
165
+ }
166
+ }
167
+ const methodImports = Array.from(usedMethods).sort().join(", ");
168
+ const routerBody = buildRouterBody(publicRoutes, protectedRoutes);
169
+ const parts = [];
170
+ parts.push(`use axum::extract::{Query, Multipart};
171
+ use axum::routing::{${methodImports}};
172
+ use axum::Router;
173
+
174
+ `);
175
+ if (queryTypeStructs.length > 0) {
176
+ parts.push(queryTypeStructs.join("\n\n"));
177
+ parts.push("\n\n");
178
+ }
179
+ parts.push(handlers.join("\n\n"));
180
+ if (hasEtag) {
181
+ parts.push(`
182
+ pub fn create_router<S, C, M>(service: S, cache: C, middleware: M) -> Router
183
+ where
184
+ S: Server + Clone + Send + Sync + 'static,
185
+ S::Claims: Send + Sync + Clone + 'static,
186
+ C: EtagCache + Clone + Send + Sync + 'static + axum::extract::FromRef<S>,
187
+ M: FnOnce(Router<S>) -> Router<S> + Clone + Send + Sync + 'static,
188
+ {
189
+ ${routerBody.replace("Router::new()", "Router::new().with_state(cache)")}
190
+ }`);
191
+ }
192
+ else {
193
+ parts.push(`
194
+ pub fn create_router<S, M>(service: S, middleware: M) -> Router
195
+ where
196
+ S: Server + Clone + Send + Sync + 'static,
197
+ S::Claims: Send + Sync + Clone + 'static,
198
+ M: FnOnce(Router<S>) -> Router<S> + Clone + Send + Sync + 'static,
199
+ {
200
+ ${routerBody}
201
+ }`);
202
+ }
203
+ return parts.join("\n");
204
+ }
205
+ export function buildRouterBody(publicRoutes, protectedRoutes) {
206
+ const lines = [];
207
+ lines.push(" let mut router = Router::new();");
208
+ if (publicRoutes.length > 0) {
209
+ lines.push(" let public = Router::new()");
210
+ for (const r of publicRoutes) {
211
+ lines.push(` ${r.trim()}`);
212
+ }
213
+ lines.push(" ;");
214
+ lines.push(" router = router.merge(public);");
215
+ }
216
+ if (protectedRoutes.length > 0) {
217
+ lines.push(" let protected = Router::new()");
218
+ for (const r of protectedRoutes) {
219
+ lines.push(` ${r.trim()}`);
220
+ }
221
+ lines.push(" ;");
222
+ lines.push(" router = router.merge(middleware(protected));");
223
+ }
224
+ lines.push(" router.with_state(service)");
225
+ return lines.join("\n");
226
+ }
227
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/generator/router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,UAAU,cAAc,CAC5B,OAAgB,EAChB,eAAoE,EACpE,cAAwD;IAExD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACzC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CACnD,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,MAAM,GAAG,YAAY,CACzB,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CACpD,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;YACvE,IAAI,CAAC,MAAM;gBAAE,SAAS;YAEtB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3C,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAExB,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,aAAa,CAAC;YAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;YAEzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;YAC1E,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAC9B,CAAC;YACF,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YAC9B,MAAM,eAAe,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAE7C,MAAM,cAAc,GAAa,EAAE,CAAC;YACpC,MAAM,UAAU,GAAa,EAAE,CAAC;YAEhC,MAAM,cAAc,GAClB,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;YAE3D,IAAI,WAAW,EAAE,CAAC;gBAChB,cAAc,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBACpE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/D,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,cAAc,CAAC,IAAI,CAAC,YAAY,UAAU,WAAW,SAAS,IAAI,CAAC,CAAC;gBACtE,CAAC;qBAAM,CAAC;oBACN,cAAc,CAAC,IAAI,CACjB,aAAa,UAAU,aAAa,SAAS,KAAK,CACnD,CAAC;gBACJ,CAAC;gBACD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;oBAC/B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,IAAI,cAAc,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,MAAM,aAAa,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC;gBAC5D,MAAM,WAAW,GAAG,WAAW;qBAC5B,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,yBAAyB,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAC7E;qBACA,IAAI,CAAC,KAAK,CAAC,CAAC;gBACf,gBAAgB,CAAC,IAAI,CACnB,2DAA2D,aAAa,OAAO,WAAW,KAAK,CAChG,CAAC;gBACF,cAAc,CAAC,IAAI,CAAC,4BAA4B,aAAa,IAAI,CAAC,CAAC;gBACnE,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;oBAChC,UAAU,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC3B,IAAI,eAAe,EAAE,CAAC;oBACpB,cAAc,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;oBAChE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,sBAAsB,CACrC,MAAM,CAAC,IAAI,CAAC,IAAI,EAChB,OAAO,EACP,cAAc,CACf,CAAC;oBACF,cAAc,CAAC,IAAI,CAAC,2BAA2B,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;oBAClE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YAED,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,GAAG,aAAa,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1F,MAAM,IAAI,GAAG,mBAAmB,CAAC;oBAC/B,aAAa;oBACb,QAAQ;oBACR,UAAU;oBACV,aAAa;oBACb,YAAY,EAAE,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU;oBAC7D,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,YAAY,EAAE,MAAM,CAAC,YAAY;iBAClC,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;gBACrC,MAAM,SAAS,GAAG,UAAU,SAAS,KAAK,MAAM,IAAI,aAAa,oBAAoB,CAAC;gBACtF,IAAI,WAAW,EAAE,CAAC;oBAChB,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAClC,CAAC;qBAAM,CAAC;oBACN,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,WAAW,WAAW,IAAI,aAAa,SAAS,CAAC;YAEpE,IAAI,gBAAgB,GAAG,MAAM,CAAC,YAAY;gBACxC,CAAC,CAAC;;;;;wDAK8C,MAAM,CAAC,YAAY;;;;;;;;;MASrE;gBACE,CAAC,CAAC;;;;;;;MAOJ,CAAC;YAED,MAAM,UAAU,GAAG,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,MAAM,WAAW,GACf,YAAY,KAAK,MAAM;gBACrB,CAAC,CAAC,YAAY,aAAa;;eAEtB,aAAa;;EAE1B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;2BAMA,WAAW,IAAI,aAAa;MACjD,gBAAgB;EACpB;gBACQ,CAAC,CAAC,gBAAgB,aAAa;2BACd,cAAc;EACvC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;;;eAGZ,UAAU;;;mBAGN,UAAU;MACvB,gBAAgB;EACpB,CAAC;YAEG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAE3B,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC;YACrC,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,WAAW,EAAE,CAAC;gBAChB,SAAS,GAAG,UAAU,SAAS,KAAK,MAAM,IAAI,aAAa,iBAAiB,CAAC;gBAC7E,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,UAAU,SAAS,KAAK,MAAM,IAAI,aAAa,iBAAiB,CAAC;gBAC7E,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAElE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC;sBACS,aAAa;;;CAGlC,CAAC,CAAC;IACD,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAElC,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC;;;;;;;;EAQb,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,iCAAiC,CAAC;EACtE,CAAC,CAAC;IACF,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC;;;;;;;EAOb,UAAU;EACV,CAAC,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,YAAsB,EACtB,eAAyB;IAEzB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Operation, Program, Namespace } from "@typespec/compiler";
2
+ import { AnonymousStringLiteralUnion } from "../models/types.js";
3
+ export declare function generateServerTrait(program: Program, namespaceGroups: {
4
+ namespace: Namespace;
5
+ operations: Operation[];
6
+ }[], anonymousEnums: Map<string, AnonymousStringLiteralUnion>): string;
@@ -0,0 +1,97 @@
1
+ import { formatDoc, toPascalCase, toRustIdent } from "../formatter/strings.js";
2
+ import { emitOperationInfo, hasAuthDecorator, getSelfReceiver, hasEtagCache, } from "../parser/operations.js";
3
+ import { getRustTypeForProperty } from "../parser/types.js";
4
+ import { hasMultipartBody } from "../parser/parameters.js";
5
+ import { generateEtagCacheTrait } from "./etag_router.js";
6
+ export function generateServerTrait(program, namespaceGroups, anonymousEnums) {
7
+ const parts = [];
8
+ parts.push(`use super::types::*;
9
+ use async_trait::async_trait;
10
+ use axum::extract::Path;
11
+ use axum::Extension;
12
+ use axum::http::StatusCode;
13
+ use axum::response::IntoResponse;
14
+ use axum::Json;
15
+ use eyre::Result;
16
+
17
+ `);
18
+ if (namespaceGroups.some((g) => g.operations.some((o) => hasEtagCache(program, o)))) {
19
+ parts.push(generateEtagCacheTrait());
20
+ parts.push("\n");
21
+ }
22
+ parts.push(`#[async_trait]
23
+ pub trait Server: Send + Sync {
24
+ type Claims: Send + Sync + 'static;
25
+
26
+ `);
27
+ for (const group of namespaceGroups) {
28
+ const nsName = toPascalCase(group.namespace.name.replace(/[^a-zA-Z0-9_]/g, "_"));
29
+ for (const op of group.operations) {
30
+ const opInfo = emitOperationInfo(program, op, "", anonymousEnums);
31
+ if (!opInfo)
32
+ continue;
33
+ if (opInfo.doc) {
34
+ parts.push(` ${formatDoc(opInfo.doc)}`);
35
+ }
36
+ const responseName = `${nsName}${toPascalCase(opInfo.name)}Response`;
37
+ const fnName = toRustIdent(`${nsName}_${opInfo.name}`);
38
+ const isProtected = hasAuthDecorator(op);
39
+ // Build parameter list for the trait method
40
+ const paramParts = [];
41
+ // Add path parameters
42
+ for (const param of opInfo.parameters) {
43
+ if (param.location === "path") {
44
+ paramParts.push(`${param.rustName}: ${param.rustType}`);
45
+ }
46
+ }
47
+ // Add query parameters
48
+ for (const param of opInfo.parameters) {
49
+ if (param.location === "query") {
50
+ paramParts.push(`${param.rustName}: ${param.rustType}`);
51
+ }
52
+ }
53
+ // Add body parameter
54
+ if (opInfo.body) {
55
+ if (hasMultipartBody(op)) {
56
+ paramParts.push(`body: Multipart`);
57
+ }
58
+ else {
59
+ const bodyType = getRustTypeForProperty(opInfo.body.type, program, anonymousEnums);
60
+ paramParts.push(`body: ${bodyType.type}`);
61
+ }
62
+ }
63
+ const paramsStr = paramParts.join(", ");
64
+ const selfReceiver = getSelfReceiver(op);
65
+ if (hasEtagCache(program, op)) {
66
+ const paramList = paramsStr ? `cache: &C, ${paramsStr}` : `cache: &C`;
67
+ if (isProtected) {
68
+ parts.push(` async fn ${fnName}<C: EtagCache + Send + Sync>(\n ${selfReceiver}, claims: Self::Claims, ${paramList}\n ) -> Result<${responseName}>;`);
69
+ }
70
+ else {
71
+ parts.push(` async fn ${fnName}<C: EtagCache + Send + Sync>(\n ${selfReceiver}, ${paramList}\n ) -> Result<${responseName}>;`);
72
+ }
73
+ }
74
+ else {
75
+ if (isProtected) {
76
+ if (paramsStr) {
77
+ parts.push(` async fn ${fnName}(${selfReceiver}, claims: Self::Claims, ${paramsStr}) -> Result<${responseName}>;`);
78
+ }
79
+ else {
80
+ parts.push(` async fn ${fnName}(${selfReceiver}, claims: Self::Claims) -> Result<${responseName}>;`);
81
+ }
82
+ }
83
+ else {
84
+ if (paramsStr) {
85
+ parts.push(` async fn ${fnName}(${selfReceiver}, ${paramsStr}) -> Result<${responseName}>;`);
86
+ }
87
+ else {
88
+ parts.push(` async fn ${fnName}(${selfReceiver}) -> Result<${responseName}>;`);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ parts.push("}");
95
+ return parts.join("\n");
96
+ }
97
+ //# sourceMappingURL=server_trait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server_trait.js","sourceRoot":"","sources":["../../../src/generator/server_trait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Enum, Model, ModelProperty, Program, Scalar, Union } from "@typespec/compiler";
2
+ import { AnonymousStringLiteralUnion } from "../models/types.js";
3
+ export declare function getAllProperties(model: Model, _program: Program): Map<string, ModelProperty>;
4
+ export declare function emitModel(model: Model, program: Program, anonymousEnums: Map<string, AnonymousStringLiteralUnion>): string;
5
+ export declare function emitEnum(enumType: Enum): string;
6
+ export declare function emitUnion(union: Union, program: Program): string;
7
+ export declare function emitScalar(scalar: Scalar, program: Program): {
8
+ typeDef: string;
9
+ impls: string[];
10
+ };
11
+ export declare function emitStringLiteralUnion(union: Union): string;
@@ -0,0 +1,209 @@
1
+ import { getDoc, getFormat, getPattern, } from "@typespec/compiler";
2
+ import { rustAttrKey, rustDeriveKey, rustImplKey } from "../models/keys.js";
3
+ import { formatToRust, scalarToRust } from "../formatter/mappings.js";
4
+ import { formatDoc, toPascalCase, toRustIdent, toRustVariantName, } from "../formatter/strings.js";
5
+ import { getRustTypeForProperty } from "../parser/types.js";
6
+ export function getAllProperties(model, _program) {
7
+ const props = new Map();
8
+ if (model.baseModel) {
9
+ const baseProps = getAllProperties(model.baseModel, _program);
10
+ for (const [key, value] of baseProps) {
11
+ props.set(key, value);
12
+ }
13
+ }
14
+ for (const [key, value] of model.properties) {
15
+ props.set(key, value);
16
+ }
17
+ return props;
18
+ }
19
+ export function emitModel(model, program, anonymousEnums) {
20
+ const parts = [];
21
+ const name = toPascalCase(model.name);
22
+ const allProps = getAllProperties(model, program);
23
+ const deriveAttrs = [
24
+ "Debug",
25
+ "Clone",
26
+ "serde::Serialize",
27
+ "serde::Deserialize",
28
+ ];
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ const customDerives = model[rustDeriveKey];
31
+ if (customDerives) {
32
+ deriveAttrs.push(...customDerives.derives);
33
+ }
34
+ parts.push(`#[derive(${deriveAttrs.join(", ")})]`);
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ const customAttrs = model[rustAttrKey];
37
+ if (customAttrs) {
38
+ for (const attr of customAttrs.attrs) {
39
+ parts.push(`#[${attr}]`);
40
+ }
41
+ }
42
+ if (allProps.size > 0) {
43
+ const fields = [];
44
+ for (const [propName, prop] of allProps) {
45
+ const doc = getDoc(program, prop);
46
+ const { type: rustType } = getRustTypeForProperty(prop.type, program, anonymousEnums);
47
+ const optional = prop.optional ? true : false;
48
+ const fieldName = toRustIdent(propName);
49
+ const serdeRename = propName !== fieldName ? `#[serde(rename = "${propName}")]` : "";
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ const propAttrs = prop[rustAttrKey];
52
+ if (doc) {
53
+ fields.push(` ${formatDoc(doc)}`);
54
+ }
55
+ if (propAttrs) {
56
+ for (const attr of propAttrs.attrs) {
57
+ fields.push(` #[${attr}]`);
58
+ }
59
+ }
60
+ if (serdeRename) {
61
+ fields.push(` ${serdeRename}`);
62
+ }
63
+ if (optional) {
64
+ fields.push(` #[serde(skip_serializing_if = "Option::is_none")]`);
65
+ }
66
+ fields.push(` pub ${fieldName}: ${optional ? `Option<${rustType}>` : rustType},`);
67
+ }
68
+ parts.push(`pub struct ${name} {
69
+ ${fields.join("\n")}
70
+ }`);
71
+ }
72
+ else {
73
+ parts.push(`pub struct ${name}`);
74
+ parts.push("(());");
75
+ }
76
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
+ const customImpl = model[rustImplKey];
78
+ if (customImpl) {
79
+ parts.push(`
80
+ ${customImpl.impl}`);
81
+ }
82
+ return parts.join("\n");
83
+ }
84
+ export function emitEnum(enumType) {
85
+ const parts = [];
86
+ const name = toPascalCase(enumType.name);
87
+ const members = Array.from(enumType.members.values());
88
+ const isString = members.every((m) => m.value === undefined || typeof m.value === "string");
89
+ const baseDerives = [
90
+ "Debug",
91
+ "Clone",
92
+ "Copy",
93
+ "PartialEq",
94
+ "Eq",
95
+ "Hash",
96
+ "Default",
97
+ "serde::Serialize",
98
+ "serde::Deserialize",
99
+ ];
100
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
+ const customDerives = enumType[rustDeriveKey];
102
+ const allDerives = [...baseDerives];
103
+ if (customDerives) {
104
+ allDerives.push(...customDerives.derives);
105
+ }
106
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
+ const customAttrs = enumType[rustAttrKey];
108
+ const attrLines = [];
109
+ if (customAttrs) {
110
+ for (const attr of customAttrs.attrs) {
111
+ attrLines.push(`#[${attr}]`);
112
+ }
113
+ }
114
+ if (isString) {
115
+ parts.push(`#[derive(${allDerives.join(", ")})]`);
116
+ if (attrLines.length > 0) {
117
+ parts.push(...attrLines);
118
+ }
119
+ parts.push(`pub enum ${name} {`);
120
+ for (let i = 0; i < members.length; i++) {
121
+ const variantName = toRustVariantName(members[i].name);
122
+ const serdeValue = members[i].value ?? members[i].name;
123
+ if (i === 0) {
124
+ parts.push(` #[default]`);
125
+ }
126
+ parts.push(` #[serde(rename = "${serdeValue}")]`);
127
+ parts.push(` ${variantName},`);
128
+ }
129
+ }
130
+ else {
131
+ parts.push(`#[derive(${allDerives.join(", ")})]`);
132
+ if (attrLines.length > 0) {
133
+ parts.push(...attrLines);
134
+ }
135
+ parts.push(`pub enum ${name} {`);
136
+ for (let i = 0; i < members.length; i++) {
137
+ const variantName = toRustVariantName(members[i].name);
138
+ const enumValue = members[i].value ?? 0;
139
+ if (i === 0) {
140
+ parts.push(` #[default]`);
141
+ }
142
+ parts.push(` ${variantName} = ${enumValue},`);
143
+ }
144
+ }
145
+ parts.push("}");
146
+ return parts.join("\n");
147
+ }
148
+ export function emitUnion(union, program) {
149
+ const parts = [];
150
+ const name = toPascalCase(union.name ?? "Union");
151
+ const variants = Array.from(union.variants.values());
152
+ if (variants.length === 0) {
153
+ parts.push(`#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]\npub enum ${name} {}\nimpl ${name} {\n pub fn new() -> Self { unreachable!() }\n}`);
154
+ return parts.join("\n");
155
+ }
156
+ parts.push(`#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]\n#[serde(untagged)]\npub enum ${name} {`);
157
+ for (let i = 0; i < variants.length; i++) {
158
+ const variant = variants[i];
159
+ const variantName = `Variant${i + 1}`;
160
+ const { type: rustType } = getRustTypeForProperty(variant.type, program, new Map());
161
+ parts.push(` ${variantName}(${rustType}),`);
162
+ }
163
+ parts.push("}");
164
+ return parts.join("\n");
165
+ }
166
+ export function emitScalar(scalar, program) {
167
+ const format = getFormat(program, scalar);
168
+ const pattern = getPattern(program, scalar);
169
+ const structName = toPascalCase(scalar.name);
170
+ const impls = [];
171
+ if (format && formatToRust[format]) {
172
+ return {
173
+ typeDef: `pub type ${structName} = ${formatToRust[format]};`,
174
+ impls: [],
175
+ };
176
+ }
177
+ if (pattern) {
178
+ const rustType = scalarToRust[scalar.name] ?? "String";
179
+ impls.push(`\nimpl TryFrom<String> for ${structName} {\n type Error = String;\n\n fn try_from(value: String) -> Result<Self, Self::Error> {\n let re = regex::Regex::new(r"${pattern}").unwrap();\n if re.is_match(&value) { Ok(Self(value)) } else { Err(format!("Invalid value: {}", value)) }\n }\n}`);
180
+ return {
181
+ typeDef: `#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize)]\npub struct ${structName}(pub ${rustType});`,
182
+ impls,
183
+ };
184
+ }
185
+ const rustType = scalarToRust[scalar.name] ?? "serde_json::Value";
186
+ return {
187
+ typeDef: `pub type ${structName} = ${rustType};`,
188
+ impls: [],
189
+ };
190
+ }
191
+ export function emitStringLiteralUnion(union) {
192
+ const parts = [];
193
+ const name = toPascalCase(union.name ?? "Value");
194
+ const variants = Array.from(union.variants.values());
195
+ parts.push(`#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize)]\n#[allow(clippy::enum_variant_names)]\npub enum ${name} {`);
196
+ for (let i = 0; i < variants.length; i++) {
197
+ const literalType = variants[i].type;
198
+ const variantName = toPascalCase(literalType.value);
199
+ const serdeValue = literalType.value;
200
+ if (i === 0) {
201
+ parts.push(` #[default]`);
202
+ }
203
+ parts.push(` #[serde(rename = "${serdeValue}")]`);
204
+ parts.push(` ${variantName},`);
205
+ }
206
+ parts.push("}");
207
+ return parts.join("\n");
208
+ }
209
+ //# sourceMappingURL=types_file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types_file.js","sourceRoot":"","sources":["../../../src/generator/types_file.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export { $onEmit } from "./emitter.js";
2
- export { $rustDerive, $rustDerives, $rustAttr, $rustAttrs, $rustImpl, $rustMut, $rustOwn, } from "./emitter.js";
2
+ export { $rustDerive, $rustDerives, $rustAttr, $rustAttrs, $rustImpl, $rustMut, $rustOwn, $etagCache, $cacheControl, } from "./decorators/index.js";
3
3
  export { $lib } from "./lib.js";
package/dist/src/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export { $onEmit } from "./emitter.js";
2
- export { $rustDerive, $rustDerives, $rustAttr, $rustAttrs, $rustImpl, $rustMut, $rustOwn, } from "./emitter.js";
2
+ export { $rustDerive, $rustDerives, $rustAttr, $rustAttrs, $rustImpl, $rustMut, $rustOwn, $etagCache, $cacheControl, } from "./decorators/index.js";
3
3
  export { $lib } from "./lib.js";
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC"}
package/dist/src/lib.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createTypeSpecLibrary } from "@typespec/compiler";
2
2
  export const $lib = createTypeSpecLibrary({
3
- name: "typespec-emitter",
3
+ name: "typespec-rust-emitter",
4
4
  diagnostics: {},
5
5
  });
6
6
  export const { reportDiagnostic, createDiagnostic } = $lib;
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACxC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACxC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EAAE,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./keys.js";
2
+ export * from "./types.js";
@@ -0,0 +1,3 @@
1
+ export * from "./keys.js";
2
+ export * from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const rustDeriveKey: unique symbol;
2
+ export declare const rustAttrKey: unique symbol;
3
+ export declare const rustImplKey: unique symbol;
4
+ export declare const rustSelfReceiverKey: unique symbol;
5
+ export declare const etagCacheKey: unique symbol;
6
+ export declare const cacheControlKey: unique symbol;