#aws-sdk #check #aws #required #macro

aws-sdk-compile-checks-macro

为AWS SDK添加编译时检查的宏

1个不稳定版本

0.1.0 2024年5月29日

263过程宏

MIT 许可证

115KB
1K SLoC

AWS SDK编译检查

检查调用AWS SDK客户端方法时是否存在必需的属性,适用于大约300个AWS crate和9000个方法。

默认情况下,当缺少必需属性时,AWS SDK将在运行时崩溃。使用此宏,我们将错误时间提前到编译时。

安装

使用以下命令将宏添加到依赖项中

cargo add aws-sdk-compile-checks

用法

将crate添加到依赖项后,您可以使用#[required_props]属性来注释使用AWS客户端的函数。

例如

use aws_sdk_compile_checks_macro::required_props;
use aws_sdk_sqs::config::BehaviorVersion;

#[required_props]
async fn example() -> Result<(), String> {
    let aws_config = aws_config::load_defaults(BehaviorVersion::latest()).await;
    let sqs_client = aws_sdk_sqs::Client::new(&aws_config);
    sqs_client.send_message()
        // missing queue url
        .message_body("some message")
        .send()
        .await;
    Ok(())
}

在上面的示例中,您将得到一个编译时错误,抱怨所需的queue_url()缺失。

您还可以将属性添加到impl块中。以下示例将编译成功,因为它具有所有必需的属性

use aws_sdk_compile_checks_macro::required_props;
use aws_sdk_sqs::Client;

struct AwsClientPrefix {
    sqs_client: Client,
}

impl AwsClientPrefix {
    #[required_props]
    async fn call(&self) {
        let _ = self.sqs_client
            .receive_message()
            .queue_url("something")
            .send()
            .await;
    }
}

您可以指定SDK。这可能可以稍微加快搜索过程。

use aws_sdk_compile_checks_macro::required_props;
use aws_sdk_sqs::Client;

#[required_props(sdk = sqs)]
async fn do_call(sqs_client: Client) {
    let _ = sqs_client
        .receive_message()
        .queue_url("something")
        .send()
        .await;
}

当方法名有重叠时,需要指定您的SDK。即当多个SDK具有给定方法名且必需属性不同时。例如,connectparticipantsqs 都有 send_message 方法。在这种情况下,宏可能无法正确识别正确的SDK。如果是这种情况,它将要求您更加具体。

限制

在没有额外参数的情况下使用时,宏会尝试通过查看签名、类型和命名等因素,做出关于特定SDK客户端的“有见识的猜测”,因为方法名通常是唯一的,我们通常只有一个必需属性的列表。

但这都是启发式方法,所以可能会出错

  • 我们可能会认为某件事是SDK调用,而实际上并不是
  • 我们可能会认为某件事不是SDK调用,而实际上是
  • 我们可能会错误地识别方法
  • ...

在足够复杂的使用案例中,误报和漏报是不可避免的。可以通过改进启发式方法来减轻,但在某些情况下,您可能需要自行采取行动。

  • 将误识别为SDK调用的代码分离出来
  • 选择有助于宏识别正确客户端的名称(例如,使用sqs_client而不是client
  • 使用sdk =指定需要检查的SDK(参见上方的“使用”部分)

从理论上讲,所需的属性可能会随着时间的推移而演变,这意味着宏应该考虑您正在运行的AWS SDK的版本。但由于这是现有属性的破坏性更改,这应该是非常罕见的。尽管如此,如果SDK中添加了尚未列入此宏维护列表的新方法,仍然可能会发生误报。

PRs等。

欢迎拉取请求、评论和建议。

待办事项

  • 减少对事物的拥有权
  • 一些重构
  • 设置GitHub操作检查
  • 在“使用”中挑选另一个比sagemaker更快的示例SDK?

尚未包含的包

目前有约30个包尚未包含,以下是一份列表。

在某些情况下,我认为这些包不太重要,或者编译时检查的使用较少。更多的包和方法意味着更多的空间和时间需求。应请求,可以从该列表中添加包。

  • aws_sdk_finspace
  • bcmdataexports
  • chime
  • chimesdkidentity
  • chimesdkmediapipelines
  • chimesdkmeetings
  • chimesdkmessaging
  • chimesdkvoice
  • cloudsearchdomain
  • databasemigration
  • ivschat
  • licensemanager
  • licensemanagerlinuxsubscriptions
  • licensemanagerusersubscriptions
  • migrationhub
  • migrationhubconfig
  • migrationhuborchestrator
  • migrationhubrefactorspaces
  • migrationhubstrategy
  • rbin
  • simspaceweaver
  • tnb
  • wellarchitected
  • wisdom
  • workdocs
  • worklink
  • workmail
  • workmailmessageflow
  • workspaces
  • workspacesthinclient
  • workspacesweb

依赖关系

~275–720KB
~17K SLoC