Skip to content

Commit 8aa7144

Browse files
authored
feat(rust): add function-local-use policy lint (#402)
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
1 parent 12cc4f1 commit 8aa7144

80 files changed

Lines changed: 441 additions & 290 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

rsworkspace/crates/a2a-auth-callout/src/credentials/mtls/tests.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use rcgen::{BasicConstraints, CertificateParams, DistinguishedName, DnType, IsCa, KeyPair};
2+
13
use super::*;
24

35
#[test]
@@ -13,8 +15,6 @@ fn rejects_empty_trust_bundle() {
1315

1416
#[tokio::test]
1517
async fn verifies_rcgen_chain() {
16-
use rcgen::{BasicConstraints, CertificateParams, DistinguishedName, DnType, IsCa, KeyPair};
17-
1818
let ca_key = KeyPair::generate().expect("ca key");
1919
let mut ca_dn = DistinguishedName::new();
2020
ca_dn.push(DnType::CommonName, "test-ca");
@@ -44,8 +44,6 @@ async fn verifies_rcgen_chain() {
4444

4545
#[tokio::test]
4646
async fn rejects_wrong_anchor() {
47-
use rcgen::{BasicConstraints, CertificateParams, DistinguishedName, DnType, IsCa, KeyPair};
48-
4947
let unrelated_key = KeyPair::generate().expect("k");
5048
let mut unrelated_dn = DistinguishedName::new();
5149
unrelated_dn.push(DnType::CommonName, "other-ca");

rsworkspace/crates/a2a-auth-callout/src/dispatcher/tests.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::*;
22
use crate::account_resolver::StaticAccountResolver;
3+
use crate::bridge_mint::{BridgeClientInfo, BridgeMintRequest};
34
use crate::credentials::api_key::{ApiKey, ApiKeyEntry, ApiKeyRegistry, HmacApiKeyVerifier};
45
use crate::credentials::mtls::ClientCertPem;
56
use crate::credentials::oidc::BearerToken;
@@ -147,8 +148,6 @@ async fn dispatch_infers_oidc_when_user_jwt_present() {
147148

148149
#[tokio::test]
149150
async fn dispatch_mtls_when_cert_present() {
150-
use crate::bridge_mint::{BridgeClientInfo, BridgeMintRequest};
151-
152151
let mtls: Arc<dyn MTlsVerifier> = Arc::new(StubMtlsVerifier);
153152
let d = dispatcher_with(None, Some(mtls), None, &["tenant-acme"]);
154153
let req = ServerAuthRequestClaims::from_bridge_mint(BridgeMintRequest {

rsworkspace/crates/a2a-auth-callout/src/error/tests.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ fn display_connect() {
1212

1313
#[test]
1414
fn display_subscribe() {
15-
use std::error::Error;
1615
let e = AuthCalloutError::Subscribe(async_nats::SubscribeError::new(
1716
async_nats::SubscribeErrorKind::InvalidSubject,
1817
));

rsworkspace/crates/a2a-auth-callout/tests/nats_server_callout_integration.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
//! would let this harness move back behind the abstraction.
1010
#![allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
1111

12+
use std::net::{IpAddr, Ipv4Addr};
1213
use std::path::{Path, PathBuf};
1314
use std::sync::{Arc, Mutex};
1415
use std::time::Duration;
@@ -33,6 +34,7 @@ use jsonwebtoken::jwk::{
3334
};
3435
use jsonwebtoken::{Algorithm, EncodingKey, Header, encode};
3536
use rand::rngs::OsRng;
37+
use rcgen::{BasicConstraints, CertificateParams, DistinguishedName, DnType, IsCa, KeyPair, SanType};
3638
use rsa::RsaPrivateKey;
3739
use rsa::pkcs8::EncodePrivateKey;
3840
use rsa::traits::PublicKeyParts;
@@ -571,10 +573,6 @@ struct TlsFixture {
571573
}
572574

573575
fn write_tls_fixture() -> TlsFixture {
574-
use std::net::{IpAddr, Ipv4Addr};
575-
576-
use rcgen::{BasicConstraints, CertificateParams, DistinguishedName, DnType, IsCa, KeyPair, SanType};
577-
578576
let dir = tempfile::tempdir().expect("tls tempdir");
579577
let cert_dir = dir.path().join("certs");
580578
std::fs::create_dir_all(&cert_dir).expect("certs dir");

rsworkspace/crates/a2a-bridge/src/auth/callout_mint.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,23 @@ use async_trait::async_trait;
99
use super::{AuthMintWire, BytesPayload};
1010
use crate::error::BridgeError;
1111

12+
#[cfg(test)]
13+
use a2a_auth_callout::StaticAccountResolver;
14+
#[cfg(test)]
15+
use a2a_auth_callout::credentials::oidc::{BearerToken, OidcVerifier};
16+
#[cfg(test)]
17+
use a2a_auth_callout::dispatcher::{CalloutDispatcher, CalloutDispatcherConfig};
18+
#[cfg(test)]
19+
use a2a_auth_callout::jwt::{AudienceAccount, CallerId, ExternalSubject, SpiceDbPrincipal, UserJwtClaims};
20+
#[cfg(test)]
21+
use a2a_auth_callout::permissions::IssuedPermissions;
22+
#[cfg(test)]
23+
use a2a_auth_callout::signing_key_source::{KeyVersion, SigningKeySource, StaticSigningKeySource};
24+
#[cfg(test)]
25+
use serde_json::json;
26+
#[cfg(test)]
27+
use std::time::Duration;
28+
1229
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
1330
pub struct BridgeTenantAccount(String);
1431

@@ -80,17 +97,6 @@ impl AuthMintWire for InProcessCalloutDispatcherMintWire {
8097

8198
#[cfg(test)]
8299
pub(crate) fn harness_callout_dispatcher(caller_id: &str) -> a2a_auth_callout::dispatcher::CalloutDispatcher {
83-
use std::sync::Arc;
84-
use std::time::Duration;
85-
86-
use a2a_auth_callout::StaticAccountResolver;
87-
use a2a_auth_callout::credentials::oidc::{BearerToken, OidcVerifier};
88-
use a2a_auth_callout::dispatcher::{CalloutDispatcher, CalloutDispatcherConfig};
89-
use a2a_auth_callout::jwt::{AudienceAccount, CallerId, ExternalSubject, SpiceDbPrincipal, UserJwtClaims};
90-
use a2a_auth_callout::permissions::IssuedPermissions;
91-
use a2a_auth_callout::signing_key_source::{KeyVersion, SigningKeySource, StaticSigningKeySource};
92-
use serde_json::json;
93-
94100
struct HarnessOidcVerifier {
95101
caller_id: CallerId,
96102
}

rsworkspace/crates/a2a-nats-http/src/rest.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use a2a::types::{
1515
ListTaskPushNotificationConfigsRequest, ListTasksRequest, SendMessageRequest, TaskPushNotificationConfig,
1616
};
1717
use a2a_nats::client::{A2aClient, ClientError};
18+
use a2a_nats::error::*;
1819
use a2a_nats::task_id::A2aTaskId;
1920
use axum::Json;
2021
use axum::extract::{Path, Query, State};
@@ -415,7 +416,6 @@ pub(crate) fn rest_error_response(err: &ClientError) -> Response {
415416
}
416417

417418
pub(crate) fn http_status_for_jsonrpc_code(code: i32) -> StatusCode {
418-
use a2a_nats::error::*;
419419
match code {
420420
TASK_NOT_FOUND => StatusCode::NOT_FOUND,
421421
TASK_NOT_CANCELABLE => StatusCode::CONFLICT,

rsworkspace/crates/a2a-nats-http/src/runtime.rs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,27 @@
66
use a2a_identity_types::JwtError;
77
use a2a_nats::{A2aPrefixError, AgentIdError};
88

9+
#[cfg(not(coverage))]
10+
use std::net::SocketAddr;
11+
12+
#[cfg(not(coverage))]
13+
use a2a_identity_types::MintedUserJwt;
14+
#[cfg(not(coverage))]
15+
use a2a_nats::client::A2aClient;
16+
#[cfg(not(coverage))]
17+
use a2a_nats::{A2aAgentId, A2aPrefix, Config, NatsConfig};
18+
#[cfg(not(coverage))]
19+
use tracing::info;
20+
#[cfg(not(coverage))]
21+
use trogon_nats::jetstream::NatsJetStreamClient;
22+
#[cfg(not(coverage))]
23+
use trogon_std::env::SystemEnv;
24+
#[cfg(not(coverage))]
25+
use trogon_std::signal::shutdown_signal;
26+
27+
#[cfg(not(coverage))]
28+
use crate::router;
29+
930
#[cfg_attr(coverage, allow(dead_code))]
1031
const DEFAULT_BIND: &str = "0.0.0.0:8080";
1132
#[cfg_attr(coverage, allow(dead_code))]
@@ -45,18 +66,6 @@ fn env_flag<E: trogon_std::env::ReadEnv>(env: &E, key: &str) -> bool {
4566

4667
#[cfg(not(coverage))]
4768
pub async fn run() -> Result<(), RuntimeError> {
48-
use std::net::SocketAddr;
49-
50-
use a2a_identity_types::MintedUserJwt;
51-
use a2a_nats::client::A2aClient;
52-
use a2a_nats::{A2aAgentId, A2aPrefix, Config, NatsConfig};
53-
use tracing::info;
54-
use trogon_nats::jetstream::NatsJetStreamClient;
55-
use trogon_std::env::SystemEnv;
56-
use trogon_std::signal::shutdown_signal;
57-
58-
use crate::router;
59-
6069
let env = SystemEnv;
6170

6271
let raw_prefix = trogon_std::env::ReadEnv::var(&env, a2a_nats::ENV_A2A_PREFIX)

rsworkspace/crates/a2a-nats-http/src/tests.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ use trogon_nats::AdvancedMockNatsClient;
1313
use trogon_nats::jetstream::mocks::MockJetStreamConsumerFactory;
1414

1515
use crate::router;
16+
use crate::runtime::RuntimeError;
17+
use crate::sse::client_error_to_jsonrpc_code;
18+
use a2a_nats::client::ClientError;
1619

1720
fn test_config() -> A2aPrefix {
1821
A2aPrefix::new("a2a".to_string()).unwrap()
@@ -368,7 +371,6 @@ async fn push_set_not_supported_maps_to_correct_error_code() {
368371

369372
#[test]
370373
fn runtime_error_display_shows_env_var_name() {
371-
use crate::runtime::RuntimeError;
372374
assert_eq!(
373375
RuntimeError::MissingAgentId.to_string(),
374376
"A2A_AGENT_ID environment variable is required"
@@ -430,9 +432,6 @@ async fn agent_routed_subject_unanswered_when_gateway_routing_enabled() {
430432

431433
#[test]
432434
fn client_error_to_jsonrpc_code_maps_known_errors() {
433-
use crate::sse::client_error_to_jsonrpc_code;
434-
use a2a_nats::client::ClientError;
435-
436435
assert_eq!(client_error_to_jsonrpc_code(&ClientError::TaskNotFound).0, -32001);
437436
assert_eq!(client_error_to_jsonrpc_code(&ClientError::TaskNotCancelable).0, -32002);
438437
assert_eq!(

rsworkspace/crates/a2a-nats-server/src/main.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,28 @@
77
//! `cfg(not(coverage))` because `trogon-nats::NatsJetStreamClient` is
88
//! excluded during coverage runs.
99
10+
#[cfg(not(coverage))]
11+
use a2a_nats::jetstream::{StreamProvisionOptions, provision_streams_with_options};
12+
#[cfg(not(coverage))]
13+
use a2a_nats::nats_connect_timeout;
14+
#[cfg(not(coverage))]
15+
use a2a_nats::server::Bridge;
16+
#[cfg(not(coverage))]
17+
use a2a_nats_server::NoopHandler;
18+
#[cfg(not(coverage))]
19+
use a2a_nats_server::runtime::{RuntimeError, parse_env};
20+
#[cfg(not(coverage))]
21+
use tokio_util::sync::CancellationToken;
22+
#[cfg(not(coverage))]
23+
use tracing::{error, info};
24+
#[cfg(not(coverage))]
25+
use trogon_nats::jetstream::NatsJetStreamClient;
26+
#[cfg(not(coverage))]
27+
use trogon_std::env::SystemEnv;
28+
1029
#[cfg(not(coverage))]
1130
#[tokio::main]
1231
async fn main() {
13-
use a2a_nats::jetstream::{StreamProvisionOptions, provision_streams_with_options};
14-
use a2a_nats::nats_connect_timeout;
15-
use a2a_nats::server::Bridge;
16-
use a2a_nats_server::NoopHandler;
17-
use a2a_nats_server::runtime::{RuntimeError, parse_env};
18-
use tokio_util::sync::CancellationToken;
19-
use tracing::{error, info};
20-
use trogon_nats::jetstream::NatsJetStreamClient;
21-
use trogon_std::env::SystemEnv;
22-
2332
tracing_subscriber::fmt::init();
2433

2534
let env = SystemEnv;

rsworkspace/crates/a2a-nats-stdio/src/runtime.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@ use a2a_nats::{A2aAgentId, A2aPrefix, A2aPrefixError, AgentIdError, DEFAULT_A2A_
99
use trogon_nats::connect::ConnectError;
1010
use trogon_std::env::ReadEnv;
1111

12+
#[cfg(not(coverage))]
13+
use a2a_nats::client::A2aClient;
14+
#[cfg(not(coverage))]
15+
use a2a_nats::{Config, apply_timeout_overrides, nats_connect_timeout};
16+
#[cfg(not(coverage))]
17+
use trogon_nats::jetstream::NatsJetStreamClient;
18+
#[cfg(not(coverage))]
19+
use trogon_std::env::SystemEnv;
20+
#[cfg(not(coverage))]
21+
use trogon_std::signal::shutdown_signal;
22+
23+
#[cfg(not(coverage))]
24+
use crate::io_loop::run_io_loop;
25+
1226
pub(crate) const ENV_A2A_AGENT_ID: &str = "A2A_AGENT_ID";
1327

1428
#[derive(Debug, thiserror::Error)]
@@ -63,14 +77,6 @@ pub fn parse_env<E: ReadEnv>(env: &E) -> Result<ValidatedStdioConfig, RuntimeErr
6377
/// `RuntimeError` on env validation failure; connect-and-pump is in main.rs.
6478
#[cfg(not(coverage))]
6579
pub async fn run() -> Result<(), RuntimeError> {
66-
use a2a_nats::client::A2aClient;
67-
use a2a_nats::{Config, apply_timeout_overrides, nats_connect_timeout};
68-
use trogon_nats::jetstream::NatsJetStreamClient;
69-
use trogon_std::env::SystemEnv;
70-
use trogon_std::signal::shutdown_signal;
71-
72-
use crate::io_loop::run_io_loop;
73-
7480
let env = SystemEnv;
7581
let validated = parse_env(&env)?;
7682

0 commit comments

Comments
 (0)