如何将Oneof与OpenAPI Generator一起用于DART?

发布于 2025-01-29 10:13:43 字数 4032 浏览 4 评论 0 原文

我正在尝试将OpenAPI Generator用于DART(特别是 Dart-Dio-Next )。首先,一些代码和工具调用片段:

API规范: https://raw.githubusercontent.com/aptos-labs/aptos-core/main/api/doc/openapi.yaml 。特别是我现在关注 TransActionPayload

OpenAPI生成器版本:

$ openapi-generator --version
openapi-generator-cli 5.4.0

CLI调用:

openapi-generator generate \
  -i https://raw.githubusercontent.com/aptos-labs/aptos-core/main/api/doc/openapi.yaml \
  -g dart-dio-next \
  -c openapi-generator.yaml \
  --enable-post-process-file \

完整脚本:

OpenApi-generator.yaml

# Unrelated fields like author omitted
pubName: aptos_api_dart
pubLibrary: "aptos_api_dart"
legacyDiscriminatorBehavior: true
# disallowAdditionalPropertiesIfNotPresent: false
useEnumExtension: true

这是我发现的一些潜在相关的文档/问题:

现在,当我尝试使用客户端时,我正在执行此操作:

// Build a transaction request.
TransactionPayloadBuilder transactionPayloadBuilder =
    TransactionPayloadBuilder()
      ..writeSet = (WriteSetBuilder())
      ..type = "script_function_payload"
      ..function_ = "0x1::Coin::transfer"
      ..typeArguments = ListBuilder(["0x1::TestCoin::TestCoin"])
      ..arguments = ListBuilder(
          [otherAddress.withPrefix(), "100"].map((e) => JsonObject(e)));
SubmitTransactionRequest submitTransactionRequest =
    (SubmitTransactionRequestBuilder()
          ..sender = account.address.withPrefix()
          ..payload = transactionPayloadBuilder)
        .build();

// Submit the transaction.
await client
    .getTransactionsApi()
    .submitTransaction(submitTransactionRequest: submitTransactionRequest);
});

但是我会遇到这样的错误:

$ flutter test
00:02 +4 -1: /Users/dport/github/aptos_sdk_dart/test/full_library_test.dart: client account e2e test [E]
  Tried to build class "SubmitTransactionRequest" but nested builder for field "payload" threw: Tried to build class "TransactionPayload" but nested builder for field "code" threw: Tried to construct class "MoveScript" with null field "bytecode". This is forbidden; to allow it, mark "bytecode" with @nullable.
  package:aptos_api_dart/src/model/submit_transaction_request.g.dart 221:9  SubmitTransactionRequestBuilder.build
  test/full_library_test.dart 51:14                                         main.<fn>

它在谈论的字段不是必需的成员我要使用的 transActionPayloadBuilder 的变体中的 scripefunctionpaypayload ,并且服务器将基于 type 是我相信的歧视器。自然地,我应该只构建 scriptfunctionpayload ,因为这仅需要必要的字段,除了我不能将其传递给 submittransaction ,因为它期望 trans> transActionPayloadBuilder 。是否有某种方法可以使其生成一个接受任何变体的 signtransaction 的版本?

您可以在此处查看它生成的内容: https://github.com/banool/banool/aptos_api_api_dart

假设我无法控制OpenAPI规格,也无法以任何方式更改它。

对如何正确使用此方法的任何帮助将不胜感激。

谢谢!

I'm trying to use the OpenAPI generator for Dart (in particular dart-dio-next). First, some code and tooling invocation snippets:

API specification: https://raw.githubusercontent.com/aptos-labs/aptos-core/main/api/doc/openapi.yaml. In particular I'm focusing on TransactionPayload right now.

OpenAPI generator version:

$ openapi-generator --version
openapi-generator-cli 5.4.0

CLI invocation:

openapi-generator generate \
  -i https://raw.githubusercontent.com/aptos-labs/aptos-core/main/api/doc/openapi.yaml \
  -g dart-dio-next \
  -c openapi-generator.yaml \
  --enable-post-process-file \

Full script: https://gist.github.com/banool/e22d94025ecd713f1596285bc6661449.

openapi-generator.yaml:

# Unrelated fields like author omitted
pubName: aptos_api_dart
pubLibrary: "aptos_api_dart"
legacyDiscriminatorBehavior: true
# disallowAdditionalPropertiesIfNotPresent: false
useEnumExtension: true

Here are some potentially relevant docs / issues I've found:

Now, when I'm trying to use the client I'm doing this:

// Build a transaction request.
TransactionPayloadBuilder transactionPayloadBuilder =
    TransactionPayloadBuilder()
      ..writeSet = (WriteSetBuilder())
      ..type = "script_function_payload"
      ..function_ = "0x1::Coin::transfer"
      ..typeArguments = ListBuilder(["0x1::TestCoin::TestCoin"])
      ..arguments = ListBuilder(
          [otherAddress.withPrefix(), "100"].map((e) => JsonObject(e)));
SubmitTransactionRequest submitTransactionRequest =
    (SubmitTransactionRequestBuilder()
          ..sender = account.address.withPrefix()
          ..payload = transactionPayloadBuilder)
        .build();

// Submit the transaction.
await client
    .getTransactionsApi()
    .submitTransaction(submitTransactionRequest: submitTransactionRequest);
});

But I get an error like this:

$ flutter test
00:02 +4 -1: /Users/dport/github/aptos_sdk_dart/test/full_library_test.dart: client account e2e test [E]
  Tried to build class "SubmitTransactionRequest" but nested builder for field "payload" threw: Tried to build class "TransactionPayload" but nested builder for field "code" threw: Tried to construct class "MoveScript" with null field "bytecode". This is forbidden; to allow it, mark "bytecode" with @nullable.
  package:aptos_api_dart/src/model/submit_transaction_request.g.dart 221:9  SubmitTransactionRequestBuilder.build
  test/full_library_test.dart 51:14                                         main.<fn>

The field it's talking about is not a required member of the variant of TransactionPayloadBuilder that I'm trying to use, ScriptFunctionPayload, and the server would know this based on type being the discriminator I believe. Naturally instead I should just build ScriptFunctionPayload, since that correctly requires only the necessary fields, except I can't pass this in to submitTransaction, because it expects a TransactionPayloadBuilder. Is there some way to make it generate a version of signTransaction that accepts any of the variants?

You can see what it generates here: https://github.com/banool/aptos_api_dart.

Assume I don't have control over the openapi spec and can't change it in any way.

Any help with how to use this correctly would be very much appreciated.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文