dub 0.2.2 → 1.0.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.

Potentially problematic release.


This version of dub might be problematic. Click here for more details.

Files changed (277) hide show
  1. data/History.txt +92 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +115 -0
  4. data/Rakefile +59 -0
  5. data/dub.gemspec +197 -0
  6. data/lib/dub/argument.rb +286 -0
  7. data/lib/dub/entities_unescape.rb +9 -0
  8. data/lib/dub/function.rb +177 -0
  9. data/lib/dub/function_group.rb +72 -0
  10. data/lib/dub/generator.rb +15 -0
  11. data/lib/dub/group.rb +20 -0
  12. data/lib/dub/klass.rb +338 -0
  13. data/lib/dub/lua/class.cpp.erb +114 -0
  14. data/lib/dub/lua/class_gen.rb +96 -0
  15. data/lib/dub/lua/function.cpp.erb +15 -0
  16. data/lib/dub/lua/function_gen.rb +329 -0
  17. data/lib/dub/lua/group.cpp.erb +9 -0
  18. data/lib/dub/lua/lua_cpp_helper.cpp +259 -0
  19. data/lib/dub/lua/lua_cpp_helper.h +219 -0
  20. data/lib/dub/lua/lua_object.cpp +158 -0
  21. data/lib/dub/lua/lua_object.h +69 -0
  22. data/lib/dub/lua/namespace.cpp.erb +42 -0
  23. data/lib/dub/lua/namespace_gen.rb +69 -0
  24. data/lib/dub/lua.rb +24 -0
  25. data/lib/dub/member_extraction.rb +128 -0
  26. data/lib/dub/namespace.rb +295 -0
  27. data/lib/dub/opts_parser.rb +30 -0
  28. data/lib/dub/parser.rb +46 -0
  29. data/lib/dub/templates/lua_template.erb +21 -0
  30. data/lib/dub/version.rb +3 -0
  31. data/lib/dub.rb +24 -20
  32. data/test/argument_test.rb +581 -0
  33. data/test/fixtures/app/CMakeLists.txt +54 -0
  34. data/test/fixtures/app/Doxyfile +1600 -0
  35. data/test/fixtures/app/bindings/all_lua.cpp +299 -0
  36. data/test/fixtures/app/include/matrix.h +283 -0
  37. data/test/fixtures/app/make_lua_bindings.rb +13 -0
  38. data/test/fixtures/app/vendor/lua/CMakeLists.txt +25 -0
  39. data/test/fixtures/app/vendor/lua/COPYRIGHT +34 -0
  40. data/test/fixtures/app/vendor/lua/HISTORY +183 -0
  41. data/test/fixtures/app/vendor/lua/INSTALL +99 -0
  42. data/test/fixtures/app/vendor/lua/Makefile +183 -0
  43. data/test/fixtures/app/vendor/lua/README +37 -0
  44. data/test/fixtures/app/vendor/lua/lapi.c +1080 -0
  45. data/test/fixtures/app/vendor/lua/lapi.h +16 -0
  46. data/test/fixtures/app/vendor/lua/lauxlib.c +653 -0
  47. data/test/fixtures/app/vendor/lua/lauxlib.h +174 -0
  48. data/test/fixtures/app/vendor/lua/lbaselib.c +643 -0
  49. data/test/fixtures/app/vendor/lua/lcode.c +839 -0
  50. data/test/fixtures/app/vendor/lua/lcode.h +76 -0
  51. data/test/fixtures/app/vendor/lua/ldblib.c +397 -0
  52. data/test/fixtures/app/vendor/lua/ldebug.c +622 -0
  53. data/test/fixtures/app/vendor/lua/ldebug.h +33 -0
  54. data/test/fixtures/app/vendor/lua/ldo.c +516 -0
  55. data/test/fixtures/app/vendor/lua/ldo.h +57 -0
  56. data/test/fixtures/app/vendor/lua/ldump.c +164 -0
  57. data/test/fixtures/app/vendor/lua/lfunc.c +174 -0
  58. data/test/fixtures/app/vendor/lua/lfunc.h +34 -0
  59. data/test/fixtures/app/vendor/lua/lgc.c +711 -0
  60. data/test/fixtures/app/vendor/lua/lgc.h +110 -0
  61. data/test/fixtures/app/vendor/lua/liblua.a +0 -0
  62. data/test/fixtures/app/vendor/lua/linit.c +38 -0
  63. data/test/fixtures/app/vendor/lua/liolib.c +532 -0
  64. data/test/fixtures/app/vendor/lua/llex.c +461 -0
  65. data/test/fixtures/app/vendor/lua/llex.h +81 -0
  66. data/test/fixtures/app/vendor/lua/llimits.h +128 -0
  67. data/test/fixtures/app/vendor/lua/lmathlib.c +263 -0
  68. data/test/fixtures/app/vendor/lua/lmem.c +86 -0
  69. data/test/fixtures/app/vendor/lua/lmem.h +49 -0
  70. data/test/fixtures/app/vendor/lua/loadlib.c +664 -0
  71. data/test/fixtures/app/vendor/lua/lobject.c +214 -0
  72. data/test/fixtures/app/vendor/lua/lobject.h +381 -0
  73. data/test/fixtures/app/vendor/lua/lopcodes.c +102 -0
  74. data/test/fixtures/app/vendor/lua/lopcodes.h +268 -0
  75. data/test/fixtures/app/vendor/lua/loslib.c +244 -0
  76. data/test/fixtures/app/vendor/lua/lparser.c +1337 -0
  77. data/test/fixtures/app/vendor/lua/lparser.h +82 -0
  78. data/test/fixtures/app/vendor/lua/lstate.c +214 -0
  79. data/test/fixtures/app/vendor/lua/lstate.h +168 -0
  80. data/test/fixtures/app/vendor/lua/lstring.c +111 -0
  81. data/test/fixtures/app/vendor/lua/lstring.h +31 -0
  82. data/test/fixtures/app/vendor/lua/lstrlib.c +868 -0
  83. data/test/fixtures/app/vendor/lua/ltable.c +588 -0
  84. data/test/fixtures/app/vendor/lua/ltable.h +40 -0
  85. data/test/fixtures/app/vendor/lua/ltablib.c +278 -0
  86. data/test/fixtures/app/vendor/lua/ltm.c +75 -0
  87. data/test/fixtures/app/vendor/lua/ltm.h +54 -0
  88. data/test/fixtures/app/vendor/lua/lua.c +695 -0
  89. data/test/fixtures/app/vendor/lua/lua.h +385 -0
  90. data/test/fixtures/app/vendor/lua/lua_dub_helper.h +77 -0
  91. data/test/fixtures/app/vendor/lua/luac +0 -0
  92. data/test/fixtures/app/vendor/lua/luac.c +200 -0
  93. data/test/fixtures/app/vendor/lua/luaconf.h +762 -0
  94. data/test/fixtures/app/vendor/lua/lualib.h +53 -0
  95. data/test/fixtures/app/vendor/lua/lundump.c +223 -0
  96. data/test/fixtures/app/vendor/lua/lundump.h +36 -0
  97. data/test/fixtures/app/vendor/lua/lvm.c +765 -0
  98. data/test/fixtures/app/vendor/lua/lvm.h +36 -0
  99. data/test/fixtures/app/vendor/lua/lzio.c +82 -0
  100. data/test/fixtures/app/vendor/lua/lzio.h +67 -0
  101. data/test/fixtures/app/vendor/lua/matrix.h +102 -0
  102. data/test/fixtures/app/vendor/lua/print.c +227 -0
  103. data/test/fixtures/app/vendor/lua/test/README +26 -0
  104. data/test/fixtures/app/vendor/lua/test/bisect.lua +27 -0
  105. data/test/fixtures/app/vendor/lua/test/cf.lua +16 -0
  106. data/test/fixtures/app/vendor/lua/test/echo.lua +5 -0
  107. data/test/fixtures/app/vendor/lua/test/env.lua +7 -0
  108. data/test/fixtures/app/vendor/lua/test/factorial.lua +32 -0
  109. data/test/fixtures/app/vendor/lua/test/fib.lua +40 -0
  110. data/test/fixtures/app/vendor/lua/test/fibfor.lua +13 -0
  111. data/test/fixtures/app/vendor/lua/test/globals.lua +13 -0
  112. data/test/fixtures/app/vendor/lua/test/hello.lua +3 -0
  113. data/test/fixtures/app/vendor/lua/test/life.lua +111 -0
  114. data/test/fixtures/app/vendor/lua/test/luac.lua +7 -0
  115. data/test/fixtures/app/vendor/lua/test/printf.lua +7 -0
  116. data/test/fixtures/app/vendor/lua/test/readonly.lua +12 -0
  117. data/test/fixtures/app/vendor/lua/test/sieve.lua +29 -0
  118. data/test/fixtures/app/vendor/lua/test/sort.lua +66 -0
  119. data/test/fixtures/app/vendor/lua/test/table.lua +12 -0
  120. data/test/fixtures/app/vendor/lua/test/trace-calls.lua +32 -0
  121. data/test/fixtures/app/vendor/lua/test/trace-globals.lua +38 -0
  122. data/test/fixtures/app/vendor/lua/test/xd.lua +14 -0
  123. data/test/fixtures/app/xml/classdub_1_1_base.xml +85 -0
  124. data/test/fixtures/app/xml/classdub_1_1_custom_destructor.xml +67 -0
  125. data/test/fixtures/app/xml/classdub_1_1_deletable_out_of_lua.xml +43 -0
  126. data/test/fixtures/app/xml/classdub_1_1_matrix.xml +482 -0
  127. data/test/fixtures/app/xml/classdub_1_1_no_destructor.xml +49 -0
  128. data/test/fixtures/app/xml/classdub_1_1_priv_sub_base.xml +89 -0
  129. data/test/fixtures/app/xml/classdub_1_1_private_constr.xml +68 -0
  130. data/test/fixtures/app/xml/classdub_1_1_static_constr.xml +69 -0
  131. data/test/fixtures/app/xml/classdub_1_1_sub_base.xml +89 -0
  132. data/test/fixtures/app/xml/classdub_1_1_t_mat.xml +252 -0
  133. data/test/fixtures/app/xml/combine.xslt +15 -0
  134. data/test/fixtures/app/xml/compound.xsd +814 -0
  135. data/test/fixtures/app/xml/dir_53661a2bdeb1d55e60581a7e15deb763.xml +12 -0
  136. data/test/fixtures/app/xml/index.xml +91 -0
  137. data/test/fixtures/app/xml/index.xsd +66 -0
  138. data/test/fixtures/app/xml/matrix_8h.xml +310 -0
  139. data/test/fixtures/app/xml/namespacedub.xml +48 -0
  140. data/test/fixtures/classcv_1_1_mat.xml +1996 -0
  141. data/test/fixtures/classcv_1_1_point__.xml +341 -0
  142. data/test/fixtures/classcv_1_1_scalar__.xml +269 -0
  143. data/test/fixtures/classcv_1_1_size__.xml +270 -0
  144. data/test/fixtures/dummy_class.cpp.erb +1 -0
  145. data/test/fixtures/dummy_function.cpp.erb +1 -0
  146. data/test/fixtures/group___magic_type.xml +406 -0
  147. data/test/fixtures/namespacecv.xml +12659 -0
  148. data/test/function_group_test.rb +43 -0
  149. data/test/function_test.rb +405 -0
  150. data/test/group_test.rb +241 -0
  151. data/test/helper.rb +34 -0
  152. data/test/klass_test.rb +551 -0
  153. data/test/lua_function_gen_test.rb +242 -0
  154. data/test/namespace_test.rb +220 -0
  155. data/test/parser_test.rb +36 -0
  156. metadata +229 -272
  157. checksums.yaml +0 -7
  158. data/lib/open_api_sdk/analytics.rb +0 -99
  159. data/lib/open_api_sdk/domains.rb +0 -353
  160. data/lib/open_api_sdk/dub.rb +0 -88
  161. data/lib/open_api_sdk/links.rb +0 -766
  162. data/lib/open_api_sdk/metatags.rb +0 -54
  163. data/lib/open_api_sdk/models/operations/bulkcreatelinks_response.rb +0 -60
  164. data/lib/open_api_sdk/models/operations/bulkupdatelinks_requestbody.rb +0 -27
  165. data/lib/open_api_sdk/models/operations/bulkupdatelinks_response.rb +0 -60
  166. data/lib/open_api_sdk/models/operations/color.rb +0 -24
  167. data/lib/open_api_sdk/models/operations/createdomain_requestbody.rb +0 -33
  168. data/lib/open_api_sdk/models/operations/createdomain_response.rb +0 -60
  169. data/lib/open_api_sdk/models/operations/createlink_requestbody.rb +0 -95
  170. data/lib/open_api_sdk/models/operations/createlink_response.rb +0 -60
  171. data/lib/open_api_sdk/models/operations/createtag_requestbody.rb +0 -32
  172. data/lib/open_api_sdk/models/operations/createtag_response.rb +0 -60
  173. data/lib/open_api_sdk/models/operations/data.rb +0 -83
  174. data/lib/open_api_sdk/models/operations/deletedomain_request.rb +0 -24
  175. data/lib/open_api_sdk/models/operations/deletedomain_response.rb +0 -60
  176. data/lib/open_api_sdk/models/operations/deletedomain_responsebody.rb +0 -24
  177. data/lib/open_api_sdk/models/operations/deletelink_request.rb +0 -24
  178. data/lib/open_api_sdk/models/operations/deletelink_response.rb +0 -60
  179. data/lib/open_api_sdk/models/operations/deletelink_responsebody.rb +0 -24
  180. data/lib/open_api_sdk/models/operations/event.rb +0 -21
  181. data/lib/open_api_sdk/models/operations/getlinkinfo_request.rb +0 -33
  182. data/lib/open_api_sdk/models/operations/getlinkinfo_response.rb +0 -60
  183. data/lib/open_api_sdk/models/operations/getlinks_request.rb +0 -51
  184. data/lib/open_api_sdk/models/operations/getlinks_response.rb +0 -60
  185. data/lib/open_api_sdk/models/operations/getlinkscount_request.rb +0 -48
  186. data/lib/open_api_sdk/models/operations/getlinkscount_response.rb +0 -60
  187. data/lib/open_api_sdk/models/operations/getmetatags_request.rb +0 -24
  188. data/lib/open_api_sdk/models/operations/getmetatags_response.rb +0 -33
  189. data/lib/open_api_sdk/models/operations/getmetatags_responsebody.rb +0 -30
  190. data/lib/open_api_sdk/models/operations/getqrcode_request.rb +0 -39
  191. data/lib/open_api_sdk/models/operations/getqrcode_response.rb +0 -60
  192. data/lib/open_api_sdk/models/operations/gettags_response.rb +0 -60
  193. data/lib/open_api_sdk/models/operations/getworkspace_request.rb +0 -24
  194. data/lib/open_api_sdk/models/operations/getworkspace_response.rb +0 -60
  195. data/lib/open_api_sdk/models/operations/groupby.rb +0 -28
  196. data/lib/open_api_sdk/models/operations/interval.rb +0 -25
  197. data/lib/open_api_sdk/models/operations/level.rb +0 -21
  198. data/lib/open_api_sdk/models/operations/listdomains_response.rb +0 -60
  199. data/lib/open_api_sdk/models/operations/paymentprocessor.rb +0 -20
  200. data/lib/open_api_sdk/models/operations/requestbody.rb +0 -95
  201. data/lib/open_api_sdk/models/operations/retrieveanalytics_request.rb +0 -81
  202. data/lib/open_api_sdk/models/operations/retrieveanalytics_response.rb +0 -60
  203. data/lib/open_api_sdk/models/operations/sort.rb +0 -20
  204. data/lib/open_api_sdk/models/operations/trackcustomer_requestbody.rb +0 -33
  205. data/lib/open_api_sdk/models/operations/trackcustomer_response.rb +0 -60
  206. data/lib/open_api_sdk/models/operations/trackcustomer_responsebody.rb +0 -33
  207. data/lib/open_api_sdk/models/operations/tracklead_requestbody.rb +0 -42
  208. data/lib/open_api_sdk/models/operations/tracklead_response.rb +0 -60
  209. data/lib/open_api_sdk/models/operations/tracklead_responsebody.rb +0 -42
  210. data/lib/open_api_sdk/models/operations/tracksale_requestbody.rb +0 -42
  211. data/lib/open_api_sdk/models/operations/tracksale_response.rb +0 -60
  212. data/lib/open_api_sdk/models/operations/tracksale_responsebody.rb +0 -42
  213. data/lib/open_api_sdk/models/operations/updatedomain_request.rb +0 -27
  214. data/lib/open_api_sdk/models/operations/updatedomain_requestbody.rb +0 -33
  215. data/lib/open_api_sdk/models/operations/updatedomain_response.rb +0 -60
  216. data/lib/open_api_sdk/models/operations/updatelink_request.rb +0 -27
  217. data/lib/open_api_sdk/models/operations/updatelink_requestbody.rb +0 -95
  218. data/lib/open_api_sdk/models/operations/updatelink_response.rb +0 -60
  219. data/lib/open_api_sdk/models/operations/updatetag_color.rb +0 -24
  220. data/lib/open_api_sdk/models/operations/updatetag_request.rb +0 -27
  221. data/lib/open_api_sdk/models/operations/updatetag_requestbody.rb +0 -32
  222. data/lib/open_api_sdk/models/operations/updatetag_response.rb +0 -60
  223. data/lib/open_api_sdk/models/operations/updateworkspace_request.rb +0 -27
  224. data/lib/open_api_sdk/models/operations/updateworkspace_requestbody.rb +0 -27
  225. data/lib/open_api_sdk/models/operations/updateworkspace_response.rb +0 -60
  226. data/lib/open_api_sdk/models/operations/upsertlink_requestbody.rb +0 -95
  227. data/lib/open_api_sdk/models/operations/upsertlink_response.rb +0 -60
  228. data/lib/open_api_sdk/models/operations.rb +0 -74
  229. data/lib/open_api_sdk/models/shared/badrequest.rb +0 -24
  230. data/lib/open_api_sdk/models/shared/code.rb +0 -18
  231. data/lib/open_api_sdk/models/shared/color.rb +0 -24
  232. data/lib/open_api_sdk/models/shared/conflict.rb +0 -24
  233. data/lib/open_api_sdk/models/shared/conflict_code.rb +0 -18
  234. data/lib/open_api_sdk/models/shared/conflict_error.rb +0 -30
  235. data/lib/open_api_sdk/models/shared/countrycode.rb +0 -267
  236. data/lib/open_api_sdk/models/shared/domains.rb +0 -27
  237. data/lib/open_api_sdk/models/shared/domainschema.rb +0 -48
  238. data/lib/open_api_sdk/models/shared/error.rb +0 -30
  239. data/lib/open_api_sdk/models/shared/forbidden.rb +0 -24
  240. data/lib/open_api_sdk/models/shared/forbidden_code.rb +0 -18
  241. data/lib/open_api_sdk/models/shared/forbidden_error.rb +0 -30
  242. data/lib/open_api_sdk/models/shared/geo.rb +0 -771
  243. data/lib/open_api_sdk/models/shared/internalservererror.rb +0 -24
  244. data/lib/open_api_sdk/models/shared/internalservererror_code.rb +0 -18
  245. data/lib/open_api_sdk/models/shared/internalservererror_error.rb +0 -30
  246. data/lib/open_api_sdk/models/shared/inviteexpired.rb +0 -24
  247. data/lib/open_api_sdk/models/shared/inviteexpired_code.rb +0 -18
  248. data/lib/open_api_sdk/models/shared/inviteexpired_error.rb +0 -30
  249. data/lib/open_api_sdk/models/shared/linkgeotargeting.rb +0 -771
  250. data/lib/open_api_sdk/models/shared/linkschema.rb +0 -142
  251. data/lib/open_api_sdk/models/shared/notfound.rb +0 -24
  252. data/lib/open_api_sdk/models/shared/notfound_code.rb +0 -18
  253. data/lib/open_api_sdk/models/shared/notfound_error.rb +0 -30
  254. data/lib/open_api_sdk/models/shared/plan.rb +0 -24
  255. data/lib/open_api_sdk/models/shared/ratelimitexceeded.rb +0 -24
  256. data/lib/open_api_sdk/models/shared/ratelimitexceeded_code.rb +0 -18
  257. data/lib/open_api_sdk/models/shared/ratelimitexceeded_error.rb +0 -30
  258. data/lib/open_api_sdk/models/shared/role.rb +0 -19
  259. data/lib/open_api_sdk/models/shared/security.rb +0 -24
  260. data/lib/open_api_sdk/models/shared/tagschema.rb +0 -30
  261. data/lib/open_api_sdk/models/shared/unauthorized.rb +0 -24
  262. data/lib/open_api_sdk/models/shared/unauthorized_code.rb +0 -18
  263. data/lib/open_api_sdk/models/shared/unauthorized_error.rb +0 -30
  264. data/lib/open_api_sdk/models/shared/unprocessableentity.rb +0 -24
  265. data/lib/open_api_sdk/models/shared/unprocessableentity_code.rb +0 -18
  266. data/lib/open_api_sdk/models/shared/unprocessableentity_error.rb +0 -30
  267. data/lib/open_api_sdk/models/shared/users.rb +0 -24
  268. data/lib/open_api_sdk/models/shared/workspaceschema.rb +0 -81
  269. data/lib/open_api_sdk/models/shared.rb +0 -49
  270. data/lib/open_api_sdk/qr_codes.rb +0 -97
  271. data/lib/open_api_sdk/sdkconfiguration.rb +0 -52
  272. data/lib/open_api_sdk/tags.rb +0 -272
  273. data/lib/open_api_sdk/track.rb +0 -276
  274. data/lib/open_api_sdk/utils/metadata_fields.rb +0 -150
  275. data/lib/open_api_sdk/utils/t.rb +0 -59
  276. data/lib/open_api_sdk/utils/utils.rb +0 -772
  277. data/lib/open_api_sdk/workspaces.rb +0 -192
@@ -1,772 +0,0 @@
1
- # Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.
2
-
3
- # typed: true
4
- # frozen_string_literal: true
5
-
6
- require 'date'
7
- require 'sorbet-runtime'
8
- require 'base64'
9
- require_relative './metadata_fields'
10
-
11
- module OpenApiSDK
12
- module Utils
13
- extend T::Sig
14
-
15
- class FieldAugmented
16
- include MetadataFields
17
- end
18
-
19
- sig { params(val: Object, primitives: T::Boolean).returns(Object) }
20
- def self.val_to_string(val, primitives: true)
21
- if val.is_a? T::Enum
22
- val.serialize
23
- elsif val.is_a? DateTime
24
- val.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
25
- elsif primitives
26
- val.to_s
27
- else
28
- val
29
- end
30
- end
31
-
32
- sig { params(headers_params: FieldAugmented, gbls: T.nilable(T::Hash[Symbol, T::Hash[Symbol, T::Hash[Symbol, Object]]])).returns(T::Hash[Symbol, String]) }
33
- def self.get_headers(headers_params, gbls = nil)
34
- return {} if headers_params.nil?
35
-
36
- headers = {}
37
- param_fields = headers_params.fields
38
- param_fields.each do |f|
39
- metadata = f.metadata[:header]
40
- next if metadata.nil?
41
-
42
- value = _populate_from_globals(f.name, headers_params&.send(f.name), 'header', gbls)
43
- value = _serialize_header(metadata.fetch(:explode, false), value)
44
- headers[metadata.fetch(:field_name, f.name)] = value if !value.empty?
45
- end
46
- headers
47
- end
48
-
49
- sig { params(explode: T::Boolean, obj: Object).returns(String) }
50
- def self._serialize_header(explode, obj)
51
- return '' if obj.nil?
52
-
53
- if obj.respond_to? :fields
54
- items = []
55
- obj_fields = obj.fields
56
- obj_fields.each do |obj_field|
57
- obj_param_metadata = obj_field.metadata[:header]
58
- next if obj_param_metadata.nil?
59
-
60
- obj_field_name = obj_param_metadata.fetch(:field_name, obj_field.name)
61
- next if obj_field_name == ''
62
-
63
- val = obj.send(obj_field.name)
64
- next if val.nil?
65
-
66
- if explode
67
- items.append("#{obj_field_name}=#{val_to_string(val)}")
68
- else
69
- items.append(obj_field_name)
70
- items.append(val_to_string(val))
71
- end
72
- end
73
-
74
- items.join(',') if !items.empty?
75
- elsif obj.is_a? Hash
76
- items = []
77
- obj.each do |key, value|
78
- next if value.nil?
79
-
80
- if explode
81
- items.append("#{key}=#{val_to_string(value)}")
82
- else
83
- items.append(key)
84
- items.append(val_to_string(value))
85
- end
86
- end
87
-
88
- items.join(',') if !items.empty?
89
- elsif obj.is_a? Array
90
- items = obj.filter { |v| !v.nil? }.map { |v| val_to_string(v) }.join(',')
91
- else
92
- val_to_string(obj)
93
- end
94
- end
95
-
96
- sig do
97
- params(field_name: String, explode: T::Boolean, obj: Object, delimiter: String,
98
- get_field_name_lambda: T.proc.params(obj_field: MetadataFields::Field).returns(String))
99
- .returns(T::Hash[Symbol, T::Array[String]])
100
- end
101
- def self._populate_form(field_name, explode, obj, delimiter, &get_field_name_lambda)
102
- params = {}
103
-
104
- return params if obj.nil?
105
-
106
- if obj.respond_to? :fields
107
- items = []
108
- obj_fields = obj.fields
109
- obj_fields.each do |obj_field|
110
- obj_field_name = get_field_name_lambda.call(obj_field)
111
- next if obj_field_name == ''
112
-
113
- val = obj.send(obj_field.name.to_sym)
114
- next if val.nil?
115
-
116
- if explode
117
- params[obj_field_name] = [val_to_string(val)]
118
- else
119
- items.append("#{obj_field_name}#{delimiter}#{val_to_string(val)}")
120
- end
121
- end
122
-
123
- params[field_name] = [items.join(delimiter)] if !items.empty?
124
- elsif obj.is_a? Hash
125
- items = []
126
- obj.each do |key, value|
127
- next if value.nil?
128
-
129
- if explode
130
- params[key] = val_to_string(value)
131
- else
132
- items.append("#{key}#{delimiter}#{val_to_string(value)}")
133
- end
134
- end
135
- params[field_name] = [items.join(delimiter)] if !items.empty?
136
-
137
- elsif obj.is_a? Array
138
- items = []
139
- obj.each do |value|
140
- next if value.nil?
141
-
142
- if explode
143
- params[field_name] = [] if !params.key? field_name
144
-
145
- params[field_name].append(val_to_string(value))
146
- else
147
- items.append(val_to_string(value))
148
- end
149
- end
150
- params[field_name] = items.map(&:to_s).join(delimiter) if !items.empty?
151
-
152
- else
153
- params[field_name] = val_to_string(obj)
154
- end
155
- params
156
- end
157
-
158
- sig do
159
- params(metadata: T::Hash[Symbol, String], field_name: String, obj: Object)
160
- .returns(T::Hash[Symbol, T::Array[String]])
161
- end
162
- def self._get_deep_object_query_params(metadata, field_name, obj)
163
- params = {}
164
-
165
- return params if obj.nil?
166
-
167
- if obj.respond_to? :fields
168
- obj_fields = obj.fields
169
- obj_fields.each do |obj_field|
170
- obj_param_metadata = obj_field.metadata[:query_param]
171
- next if obj_param_metadata.nil?
172
-
173
- val = obj.send(obj_field.name)
174
- next if val.nil?
175
-
176
- key = "#{metadata.fetch(:field_name, field_name)}[#{obj_param_metadata.fetch(:field_name, obj_field.name)}]"
177
- if val.is_a? Array
178
- val.each do |v|
179
- next if v.nil?
180
-
181
- params[key] = [] if !params.include? key
182
-
183
- params[key] << val_to_string(v)
184
- end
185
- else
186
- params[key] = [val_to_string(val)]
187
- end
188
- end
189
- elsif obj.is_a? Hash
190
- obj.each do |key, value|
191
- next if value.nil?
192
-
193
- param_key = "#{metadata.fetch(:field_name, field_name)}[#{key}]"
194
- if value.is_a? Array
195
- value.each do |val|
196
- next if val.nil?
197
-
198
- params[param_key] = [] if !params.include? param_key
199
-
200
- params[param_key].append(val_to_string(val))
201
- end
202
- else
203
- params[param_key] = [val_to_string(value)]
204
- end
205
- end
206
- end
207
- params
208
- end
209
-
210
- sig do
211
- params(metadata: T::Hash[Symbol, String], field_name: String, obj: Object)
212
- .returns(T::Hash[Symbol, T::Array[String]])
213
- end
214
- def self._get_serialized_params(metadata, field_name, obj)
215
- params = {}
216
-
217
- serialization = metadata.fetch(:serialization, '')
218
- params[metadata.fetch(:field_name, field_name)] = obj.marshal_json if serialization == 'json'
219
-
220
- params
221
- end
222
-
223
- sig do
224
- params(metadata: T::Hash[Symbol, String], field_name: String, obj: Object, delimiter: String)
225
- .returns(T::Hash[Symbol, T::Array[String]])
226
- end
227
- def self._get_delimited_query_params(metadata, field_name, obj, delimiter)
228
- get_query_param_field_name = lambda do |obj_field|
229
- obj_param_metadata = obj_field.metadata[:query_param]
230
-
231
- return '' if obj_param_metadata.nil?
232
-
233
- return obj_param_metadata.fetch(:field_name, obj_field.name)
234
- end
235
-
236
- _populate_form(field_name, metadata.fetch(:explode, true), obj, delimiter, &get_query_param_field_name)
237
- end
238
-
239
- sig { params(clazz: Class, query_params: FieldAugmented, gbls: T.nilable(T::Hash[Symbol, T::Hash[Symbol, T::Hash[Symbol, Object]]])).returns(T::Hash[Symbol, T::Array[String]]) }
240
- def self.get_query_params(clazz, query_params, gbls = nil)
241
- params = {}
242
- param_fields = clazz.fields
243
- param_fields.each do |f|
244
- request_metadata = f.metadata[:request]
245
- next if !request_metadata.nil?
246
-
247
- metadata = f.metadata[:query_param]
248
- next if metadata.nil?
249
-
250
- param_name = f.name
251
- value = query_params&.send(param_name.to_sym)
252
- value = _populate_from_globals(param_name, value, 'queryParam', gbls)
253
-
254
- f_name = metadata[:field_name]
255
- serialization = metadata.fetch(:serialization, '')
256
- if serialization != ''
257
- params = params.merge _get_serialized_params(
258
- metadata, f_name, value
259
- )
260
- else
261
- style = metadata.fetch(:style, 'form')
262
- case style
263
- when 'deepObject'
264
- params = params.merge _get_deep_object_query_params(
265
- metadata, f_name, value
266
- )
267
- when 'form'
268
- params = params.merge _get_delimited_query_params(
269
- metadata, f_name, value, ','
270
- )
271
- when 'pipeDelimited'
272
- params = params.merge _get_delimited_query_params(
273
- metadata, f_name, value, '|'
274
- )
275
- else
276
- raise StandardError, 'not yet implemented'
277
- end
278
- end
279
- end
280
- params
281
- end
282
-
283
- sig { params(clazz: Class, server_url: String, path: String, path_params: FieldAugmented, gbls: T.nilable(T::Hash[Symbol, T::Hash[Symbol, T::Hash[Symbol, Object]]])).returns(String) }
284
- def self.generate_url(clazz, server_url, path, path_params, gbls = nil)
285
- clazz.fields.each do |f|
286
- param_metadata = f.metadata[:path_param]
287
- next if param_metadata.nil?
288
-
289
- if param_metadata.fetch(:style, 'simple') == 'simple'
290
- param = path_params.send(f.name) if !path_params.nil?
291
- param = _populate_from_globals(f.name, param, 'pathParam', gbls)
292
- end
293
-
294
- f_name = param_metadata.fetch(:field_name, f.name)
295
- serialization = param_metadata.fetch(:serialization, '')
296
- if serialization != ''
297
- serialized_params = _get_serialized_params(param_metadata, f_name, param)
298
- serialized_params.each do |k, v|
299
- path = path.sub("{#{k}}", v)
300
- end
301
- else
302
- if param.is_a? Array
303
- pp_vals = []
304
- param.each do |pp_val|
305
- pp_vals.append(pp_val.to_s)
306
- end
307
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
308
- elsif param.is_a? Hash
309
- pp_vals = []
310
- param.each do |pp_key, pp_val|
311
- value = val_to_string(pp_val)
312
-
313
- if param_metadata.fetch(:explode, false)
314
- pp_vals.append("#{pp_key}=#{value}")
315
- else
316
- pp_vals.append("#{pp_key},#{value}")
317
- end
318
- end
319
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
320
- elsif !(param.is_a?(String) || param.is_a?(Integer) ||
321
- param.is_a?(Float) || param.is_a?(Complex) || param.is_a?(TrueClass) ||
322
- param.is_a?(FalseClass))
323
- pp_vals = []
324
- attrs = param.fields.filter { |field| field.name && param.respond_to?(field.name.to_sym) }.map(&:name)
325
- attrs.each do |attr|
326
- field = param.field(attr)
327
-
328
- param_value_metadata = field.metadata[:path_param]
329
-
330
- next if param_value_metadata.nil?
331
-
332
- parm_name = param_value_metadata.fetch(:field_name, f.name)
333
-
334
- param_field_val = param.send(attr)
335
-
336
- if param_field_val.is_a? T::Enum
337
- param_field_val = param_field_val.serialize
338
- elsif param_field_val.is_a? DateTime
339
- param_field_val = param_field_val.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
340
- end
341
- if !field.nil? && T::Utils::Nilable.is_union_with_nilclass(field.type) && param_field_val.nil?
342
- next
343
- elsif param_metadata.fetch(:explode, false)
344
- pp_vals.append("#{parm_name}=#{param_field_val}")
345
- else
346
- pp_vals.append("#{parm_name},#{param_field_val}")
347
- end
348
- end
349
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
350
- else
351
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", param.to_s)
352
- end
353
- end
354
- end
355
-
356
- server_url.delete_suffix('/') + path
357
- end
358
-
359
- sig { params(content_type: String, pattern: String).returns(T::Boolean) }
360
- def self.match_content_type(content_type, pattern)
361
- return true if content_type == pattern || pattern == '*' || pattern == '*/*'
362
-
363
- pieces = content_type.split(';')
364
- pieces.each do |piece|
365
- return true if pattern == piece.strip
366
- end
367
-
368
- false
369
- end
370
-
371
- sig { params(req: Faraday::Request, security: Object).void }
372
- def self.configure_request_security(req, security)
373
- sec_fields = security.fields
374
- sec_fields.each do |sec_field|
375
- value = security.send(sec_field.name)
376
- next if value.nil?
377
-
378
- metadata = sec_field.metadata[:security]
379
- next if metadata.nil?
380
-
381
- _parse_security_option(req, value) if metadata[:option]
382
-
383
- if metadata[:scheme]
384
- # Special case for basic auth which could be a flattened struct
385
- if metadata[:sub_type] == 'basic' && !value.respond_to?(:fields)
386
- _parse_security_scheme(req, metadata, security)
387
- else
388
- _parse_security_scheme(req, metadata, value)
389
- end
390
- end
391
- end
392
- end
393
-
394
- sig { params(req: Faraday::Request, option: Object).void }
395
- def self._parse_security_option(req, option)
396
- opt_fields = option.fields
397
- opt_fields.each do |opt_field|
398
- metadata = opt_field.metadata[:security]
399
- next if metadata.nil? || !metadata.include?(:scheme)
400
-
401
- _parse_security_scheme(req, metadata, option.send(opt_field.name))
402
- end
403
- end
404
-
405
- sig { params(req: Faraday::Request, scheme_metadata: T::Hash[Symbol, String], scheme: Object).void }
406
- def self._parse_security_scheme(req, scheme_metadata, scheme)
407
- scheme_type = scheme_metadata[:type]
408
- sub_type = scheme_metadata[:sub_type]
409
-
410
- if scheme.respond_to? :fields
411
- if scheme_type == 'http' && sub_type == 'basic'
412
- _parse_basic_auth_scheme(req, scheme)
413
- return
414
- end
415
-
416
- scheme_fields = scheme.fields
417
- scheme_fields.each do |field|
418
- metadata = field.metadata[:security]
419
- next if metadata.nil? || metadata[:field_name].nil?
420
-
421
- value = scheme.send(field.name)
422
- _parse_security_scheme_value(req, scheme_metadata, metadata, value)
423
- end
424
- else
425
- _parse_security_scheme_value(req, scheme_metadata, scheme_metadata, scheme)
426
- end
427
- end
428
-
429
- sig do
430
- params(req: Faraday::Request, scheme_metadata: T::Hash[Symbol, String],
431
- security_metadata: T::Hash[Symbol, String], value: Object).void
432
- end
433
- def self._parse_security_scheme_value(req, scheme_metadata, security_metadata, value)
434
- scheme_type = scheme_metadata[:type]
435
- sub_type = scheme_metadata[:sub_type]
436
-
437
- header_name = security_metadata[:field_name]
438
-
439
- case scheme_type
440
- when 'apiKey'
441
- case sub_type
442
- when 'header'
443
- req.headers[header_name] = value
444
- when 'query'
445
- req.params[header_name] = value
446
- when 'cookie'
447
- req.cookies[header_name] = value
448
- else
449
- raise StandardError, 'not supported'
450
- end
451
- when 'openIdConnect'
452
- req.headers[header_name] = value.downcase.start_with?('bearer ') ? value : "Bearer #{value}"
453
- when 'oauth2'
454
- req.headers[header_name] = value.downcase.start_with?('bearer ') ? value : "Bearer #{value}"
455
- when 'http'
456
- if sub_type == 'bearer'
457
- req.headers[header_name] = value.downcase.start_with?('bearer ') ? value : "Bearer #{value}"
458
- else
459
- raise StandardError, 'not supported'
460
- end
461
- else
462
- raise StandardError, 'not supported'
463
- end
464
- end
465
-
466
- sig { params(req: Faraday::Request, scheme: FieldAugmented).void }
467
- def self._parse_basic_auth_scheme(req, scheme)
468
- username, password = ''
469
-
470
- scheme_fields = scheme.fields
471
- scheme_fields.each do |scheme_field|
472
- metadata = scheme_field.metadata[:security]
473
- next if metadata.nil? || !metadata.include?(:field_name)
474
-
475
- field_name = metadata[:field_name]
476
- value = scheme.send(scheme_field.name)
477
-
478
- username = value if field_name == 'username'
479
- password = value if field_name == 'password'
480
- end
481
-
482
- data = "#{username}:#{password}".encode
483
- # Use strict_encode, because encode adds newlines after 60 chars
484
- # https://docs.ruby-lang.org/en/3.0/Base64.html#method-i-encode64
485
- req.headers['Authorization'] = "Basic #{Base64.strict_encode64(data)}"
486
- end
487
-
488
- sig { params(optional: T::Boolean).returns(T.proc.params(s: String).returns(DateTime)) }
489
- def self.datetime_from_iso_format(optional)
490
- lambda do |s|
491
- return nil if optional && s.nil?
492
-
493
- return DateTime.strptime(s, '%Y-%m-%dT%H:%M:%S.%NZ')
494
- end
495
- end
496
-
497
- sig { params(optional: T::Boolean).returns(T.proc.params(s: String).returns(Date)) }
498
- def self.date_from_iso_format(optional)
499
- lambda do |s|
500
- return nil if optional && s.nil?
501
-
502
- return Date.iso8601(s)
503
- end
504
- end
505
-
506
- sig do
507
- params(enum_type: T.class_of(T::Enum), optional: T::Boolean)
508
- .returns(T.proc.params(s: String).returns(T::Enum))
509
- end
510
- def self.enum_from_string(enum_type, optional)
511
- lambda do |s|
512
- return nil if optional && s.nil?
513
-
514
- return enum_type.deserialize(s)
515
- end
516
- end
517
-
518
- sig { params(name: String).returns(T.proc.returns(String)) }
519
- def self.field_name(name)
520
- proc { |_, field_name = name| field_name }
521
- end
522
-
523
- SERIALIZATION_METHOD_TO_CONTENT_TYPE = {
524
- 'json': 'application/json',
525
- 'form': 'application/x-www-form-urlencoded',
526
- 'multipart': 'multipart/form-data',
527
- 'raw': 'application/octet-stream',
528
- 'string': 'text/plain'
529
- }.freeze
530
-
531
- sig do
532
- params(request: Object, request_field_name: Symbol, serialization_method: Symbol)
533
- .returns([String, Object, Object])
534
- end
535
- def self.serialize_request_body(request, request_field_name, serialization_method)
536
- return ['', nil, nil] if request.nil?
537
-
538
- return serialize_content_type(request_field_name, SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], request) if !request.respond_to?(:fields) || !request.respond_to?(request_field_name)
539
-
540
- request_val = request.send(request_field_name)
541
-
542
- request_fields = request.fields
543
- request_metadata = nil
544
- request_fields.each do |f|
545
- if f.name == request_field_name
546
- request_metadata = f.metadata[:request]
547
- break
548
- end
549
- end
550
- raise StandardError, 'invalid request type' if request_metadata.nil?
551
-
552
- serialize_content_type(
553
- :request, request_metadata.fetch(:media_type, 'application/octet-stream'), request_val
554
- )
555
- end
556
-
557
- sig do
558
- params(field_name: Symbol, media_type: String, request: Object)
559
- .returns([String, Object, T.nilable(T::Array[T::Array[Object]])])
560
- end
561
- def self.serialize_content_type(field_name, media_type, request)
562
- return media_type, marshal_json_complex(request), nil if media_type.match('(application|text)\/.*?\+*json.*')
563
- return serialize_multipart_form(media_type, request) if media_type.match('multipart\/.*')
564
- return media_type, serialize_form_data(field_name, request), nil if media_type.match('application\/x-www-form-urlencoded.*')
565
- return media_type, request, nil if request.is_a?(String) || request.is_a?(Array)
566
-
567
- raise StandardError, "invalid request body type #{type(request)} for mediaType {metadata['media_type']}"
568
- end
569
-
570
- sig { params(field: MetadataFields::Field, data_class: FieldAugmented).returns(Object) }
571
- def self.parse_field(field, data_class)
572
- field_metadata = field.metadata[:metadata_string]
573
- return nil if field_metadata.nil?
574
-
575
- field_value = data_class.send(field.name)
576
- return nil if field_value.nil?
577
-
578
- field_value
579
- end
580
-
581
- sig { params(media_type: String, request: FieldAugmented).returns([String, Object, T::Array[T::Array[Object]]]) }
582
- def self.serialize_multipart_form(media_type, request)
583
- form = []
584
- request_fields = request.fields
585
- request_fields.each do |field|
586
- val = request.send(field.name)
587
- next if val.nil?
588
-
589
- field_metadata = field.metadata[:multipart_form]
590
- next if field_metadata.nil?
591
-
592
- if field_metadata[:file] == true
593
- file_fields = val.fields
594
-
595
- file_name = ''
596
- field_name = ''
597
- content = nil
598
-
599
- file_fields.each do |file_field|
600
- file_metadata = file_field.metadata[:multipart_form]
601
- next if file_metadata.nil?
602
-
603
- if file_metadata[:content] == true
604
- content = val.send(file_field.name)
605
- else
606
- field_name = file_metadata.fetch(:field_name, file_field.name)
607
- file_name = val.send(file_field.name)
608
- end
609
- end
610
- raise StandardError, 'invalid multipart/form-data file' if field_name == '' || file_name == '' || content == nil?
611
-
612
- form.append([field_name, [file_name, content]])
613
- elsif field_metadata[:json] == true
614
- to_append = [
615
- field_metadata.fetch(:field_name, field.name), [
616
- nil, marshal_json_complex(val), 'application/json'
617
- ]
618
- ]
619
- form.append(to_append)
620
- else
621
- field_name = field_metadata.fetch(
622
- :field_name, field.name
623
- )
624
- if val.is_a? Array
625
- val.each do |value|
626
- next if value.nil?
627
-
628
- form.append(
629
- ["#{field_name}[]", [nil, val_to_string(value)]]
630
- )
631
- end
632
- else
633
- form.append([field_name, [nil, val_to_string(val)]])
634
- end
635
- end
636
- end
637
- [media_type, nil, form]
638
- end
639
-
640
- sig do
641
- params(form: T::Array[T::Array[T.any(String, T::Array[T.nilable(String)])]])
642
- .returns(T::Hash[Symbol, Object])
643
- end
644
- def self.encode_form(form)
645
- payload = {}
646
- form.each do |field_name, field|
647
- if field.length == 2
648
- if field[0].nil?
649
- payload[field_name] = field[1]
650
- else
651
- payload[field_name] = Faraday::Multipart::FilePart.new(field[0], '', field[1])
652
- end
653
- elsif field.length == 3
654
- payload[field_name] = Faraday::Multipart::ParamPart.new(field[1].to_json, field[2])
655
- end
656
- end
657
- payload
658
- end
659
-
660
- sig do
661
- params(field_name: Symbol, data: T.any(FieldAugmented, T::Hash[Symbol, String]))
662
- .returns(T::Hash[Symbol, Object])
663
- end
664
- def self.serialize_form_data(field_name, data)
665
- get_form_field_name = lambda do |obj_field|
666
- obj_param_metadata = obj_field.metadata[:form]
667
-
668
- return '' if obj_param_metadata.nil?
669
-
670
- return obj_param_metadata.fetch(:field_name, obj_field.name)
671
- end
672
-
673
- form = {}
674
- if data.respond_to? :fields
675
- data.fields.each do |field|
676
- val = data.send(field.name)
677
- next if val.nil?
678
-
679
- metadata = field.metadata[:form]
680
-
681
- next if metadata.nil?
682
-
683
- field_name = metadata.fetch(:field_name, field.name)
684
-
685
- if metadata[:json]
686
- form[field_name] = marshal_json_complex(val)
687
- else
688
- if metadata.fetch(:style, 'form') == 'form'
689
- form = form.merge(
690
- _populate_form(
691
- field_name, metadata.fetch(:explode, true), val, ',', &get_form_field_name
692
- )
693
- )
694
- else
695
- raise StandardError, "Invalid form style for field #{field.name}"
696
- end
697
- end
698
- end
699
- elsif data.is_a? Hash
700
- data.each do |key, value|
701
- form[key] = [val_to_string(value)]
702
- end
703
- else
704
- raise StandardError, "Invalid request body type for field #{field_name}"
705
- end
706
-
707
- form
708
- end
709
-
710
- sig { params(url_with_params: String, params: T::Hash[Symbol, String]).returns(String) }
711
- def self.template_url(url_with_params, params)
712
- params.each do |key, value|
713
- if value.respond_to? :serialize
714
- val_str = value.serialize
715
- else
716
- val_str = value
717
- end
718
- url_with_params = url_with_params.gsub("{#{key}}", val_str)
719
- end
720
-
721
- url_with_params
722
- end
723
-
724
- sig { params(param_name: Symbol, value: Object, param_type: String, gbls: T.nilable(T::Hash[Symbol, T::Hash[Symbol, T::Hash[Symbol, Object]]])).returns(Object) }
725
- def self._populate_from_globals(param_name, value, param_type, gbls)
726
- if value.nil? && !gbls.nil?
727
- global_value = gbls.dig(:parameters, param_type.to_sym, param_name.to_sym)
728
- value = global_value if !global_value.nil?
729
- end
730
- value
731
- end
732
-
733
- sig { params(complex: Object).returns(Object) }
734
- def self.marshal_json_complex(complex)
735
- if complex.is_a? Array
736
- complex.map { |v| Utils.marshal_json_complex(v) }.to_json
737
- elsif complex.is_a? Hash
738
- complex.transform_values { |v| Utils.marshal_json_complex(v) }.to_json
739
- elsif complex.respond_to? :marshal_json
740
- complex.marshal_json
741
- else
742
- complex.to_json
743
- end
744
- end
745
-
746
- sig { params(data: Object, type: Object).returns(Object) }
747
- def self.unmarshal_complex(data, type)
748
- begin
749
- value = unmarshal_json(JSON.parse(data), type)
750
- rescue TypeError, JSON::ParserError
751
- value = unmarshal_json(data, type)
752
- end
753
- value
754
- end
755
-
756
- sig { params(data: Object, type: Object).returns(Object) }
757
- def self.unmarshal_json(data, type)
758
- if T.simplifiable? type
759
- type = T.simplify_type type
760
- end
761
- if type.respond_to? :unmarshal_json
762
- type.unmarshal_json(data)
763
- elsif T.arr? type
764
- data.map { |v| Utils.unmarshal_complex(v, T.arr_of(type)) }
765
- elsif T.hash? type
766
- data.transform_values { |v| Utils.unmarshal_complex(v, T.hash_of(type)) }
767
- else
768
- data
769
- end
770
- end
771
- end
772
- end