From 36fe9f19d77b05cdc8dc40f887f42e0515aea01a Mon Sep 17 00:00:00 2001 From: Aram Grigoryan <132480+aram356@users.noreply.github.com> Date: Mon, 13 Jul 2026 13:44:01 -0700 Subject: [PATCH 1/3] chore: inherit crate metadata from workspace and move to Rust 2024 edition Add authors, edition, publish, and version to [workspace.package] and have every crate inherit them, so metadata lives in one place instead of being re-declared per crate. Each [package] block is now name, description, then the inherited keys. Descriptions are new. Bump the workspace edition from 2021 to 2024. The upgrade compiled clean; the only source churn is mechanical: the 2024 style edition re-sorts imports, and clippy's collapsible_if now collapses nested if-let pairs into let-chains (stable in 2024). --- Cargo.toml | 4 ++ crates/mocktioneer-adapter-axum/Cargo.toml | 10 ++-- .../mocktioneer-adapter-cloudflare/Cargo.toml | 10 ++-- crates/mocktioneer-adapter-fastly/Cargo.toml | 10 ++-- .../tests/contract.rs | 2 +- crates/mocktioneer-adapter-spin/Cargo.toml | 10 ++-- .../tests/contract.rs | 2 +- crates/mocktioneer-core/Cargo.toml | 10 ++-- crates/mocktioneer-core/src/auction.rs | 18 +++---- crates/mocktioneer-core/src/mediation.rs | 2 +- crates/mocktioneer-core/src/routes.rs | 48 ++++++++++--------- crates/mocktioneer-core/src/verification.rs | 16 ++++--- .../mocktioneer-core/tests/aps_endpoints.rs | 12 +++-- crates/mocktioneer-core/tests/endpoints.rs | 2 +- 14 files changed, 88 insertions(+), 68 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bb4c1f8..8dd0b6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,11 @@ members = [ resolver = "2" [workspace.package] +authors = ["Mocktioneer Team "] +edition = "2024" license = "Apache-2.0" +publish = false +version = "0.1.0" [profile.release] debug = 1 diff --git a/crates/mocktioneer-adapter-axum/Cargo.toml b/crates/mocktioneer-adapter-axum/Cargo.toml index 94dd1ce..97e1301 100644 --- a/crates/mocktioneer-adapter-axum/Cargo.toml +++ b/crates/mocktioneer-adapter-axum/Cargo.toml @@ -1,9 +1,11 @@ [package] name = "mocktioneer-adapter-axum" -version = "0.1.0" -edition = "2021" -publish = false -license.workspace = true +description = "Native Axum HTTP server adapter for Mocktioneer." +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +version = { workspace = true } [[bin]] name = "mocktioneer-adapter-axum" diff --git a/crates/mocktioneer-adapter-cloudflare/Cargo.toml b/crates/mocktioneer-adapter-cloudflare/Cargo.toml index ae422fb..b09a828 100644 --- a/crates/mocktioneer-adapter-cloudflare/Cargo.toml +++ b/crates/mocktioneer-adapter-cloudflare/Cargo.toml @@ -1,9 +1,11 @@ [package] name = "mocktioneer-adapter-cloudflare" -version = "0.1.0" -edition = "2021" -publish = false -license.workspace = true +description = "Cloudflare Workers adapter for Mocktioneer (wasm32-unknown-unknown)." +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +version = { workspace = true } [[bin]] name = "mocktioneer-adapter-cloudflare" diff --git a/crates/mocktioneer-adapter-fastly/Cargo.toml b/crates/mocktioneer-adapter-fastly/Cargo.toml index 6e7a74d..7dbf802 100644 --- a/crates/mocktioneer-adapter-fastly/Cargo.toml +++ b/crates/mocktioneer-adapter-fastly/Cargo.toml @@ -1,9 +1,11 @@ [package] name = "mocktioneer-adapter-fastly" -version = "0.1.0" -edition = "2021" -publish = false -license.workspace = true +description = "Fastly Compute adapter for Mocktioneer (wasm32-wasip1)." +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +version = { workspace = true } [[bin]] name = "mocktioneer-adapter-fastly" diff --git a/crates/mocktioneer-adapter-fastly/tests/contract.rs b/crates/mocktioneer-adapter-fastly/tests/contract.rs index ff34776..18ea5cd 100644 --- a/crates/mocktioneer-adapter-fastly/tests/contract.rs +++ b/crates/mocktioneer-adapter-fastly/tests/contract.rs @@ -5,8 +5,8 @@ )] use edgezero_adapter_fastly::request::dispatch; -use fastly::http::{Method as FastlyMethod, StatusCode as FastlyStatus}; use fastly::Request as FastlyRequest; +use fastly::http::{Method as FastlyMethod, StatusCode as FastlyStatus}; use mocktioneer_core::build_app; fn fastly_request(method: FastlyMethod, path: &str) -> FastlyRequest { diff --git a/crates/mocktioneer-adapter-spin/Cargo.toml b/crates/mocktioneer-adapter-spin/Cargo.toml index 69e54ec..41c5c69 100644 --- a/crates/mocktioneer-adapter-spin/Cargo.toml +++ b/crates/mocktioneer-adapter-spin/Cargo.toml @@ -1,9 +1,11 @@ [package] name = "mocktioneer-adapter-spin" -version = "0.1.0" -edition = "2021" -publish = false -license.workspace = true +description = "Spin / Fermyon adapter for Mocktioneer (wasm32-wasip2)." +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +version = { workspace = true } [[bin]] name = "mocktioneer-adapter-spin" diff --git a/crates/mocktioneer-adapter-spin/tests/contract.rs b/crates/mocktioneer-adapter-spin/tests/contract.rs index 2b16c4a..774c619 100644 --- a/crates/mocktioneer-adapter-spin/tests/contract.rs +++ b/crates/mocktioneer-adapter-spin/tests/contract.rs @@ -10,7 +10,7 @@ #![cfg(all(feature = "spin", target_arch = "wasm32"))] use edgezero_core::body::Body; -use edgezero_core::http::{header, request_builder, Method, Request, Response, StatusCode}; +use edgezero_core::http::{Method, Request, Response, StatusCode, header, request_builder}; use futures::executor::block_on; use mocktioneer_core::build_app; diff --git a/crates/mocktioneer-core/Cargo.toml b/crates/mocktioneer-core/Cargo.toml index b4a9341..0fc5a48 100644 --- a/crates/mocktioneer-core/Cargo.toml +++ b/crates/mocktioneer-core/Cargo.toml @@ -1,9 +1,11 @@ [package] name = "mocktioneer-core" -version = "0.1.0" -edition = "2021" -publish = false -license.workspace = true +description = "Shared business logic for Mocktioneer: OpenRTB, APS, auction, render, and route handlers." +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +version = { workspace = true } [dependencies] async-trait = { workspace = true } diff --git a/crates/mocktioneer-core/src/auction.rs b/crates/mocktioneer-core/src/auction.rs index ff49d0f..76f6ae8 100644 --- a/crates/mocktioneer-core/src/auction.rs +++ b/crates/mocktioneer-core/src/auction.rs @@ -2,7 +2,7 @@ use crate::aps::{ApsBidRequest, ApsBidResponse, ApsContextual, ApsSlotResponse}; use crate::openrtb::{ Bid as OpenrtbBid, Imp as OpenrtbImp, MediaType, OpenRTBRequest, OpenRTBResponse, SeatBid, }; -use crate::render::{extract_ec_info, iframe_html, CreativeMetadata, SignatureStatus}; +use crate::render::{CreativeMetadata, SignatureStatus, extract_ec_info, iframe_html}; use uuid::Uuid; // ============================================================================ @@ -59,12 +59,12 @@ pub fn size_from_imp(imp: &OpenrtbImp) -> (i64, i64) { if let (Some(width), Some(height)) = (banner.width, banner.height) { return (width, height); } - if let Some(fmt) = &banner.format { - if let Some(fmt0) = fmt.first() { - let width = fmt0.width; - let height = fmt0.height; - return (width, height); - } + if let Some(fmt) = &banner.format + && let Some(fmt0) = fmt.first() + { + let width = fmt0.width; + let height = fmt0.height; + return (width, height); } } (300, 250) @@ -197,7 +197,7 @@ pub fn build_openrtb_response( /// Our mock uses transparent base64 encoding that CAN be decoded for testing/debugging purposes. /// Example: `echo "MC4y" | base64 -d` → `0.2`. fn encode_aps_price(price: f64) -> String { - use base64::{engine::general_purpose::STANDARD, Engine as _}; + use base64::{Engine as _, engine::general_purpose::STANDARD}; let price_str = price.to_string(); STANDARD.encode(price_str.as_bytes()) @@ -210,7 +210,7 @@ fn encode_aps_price(price: f64) -> String { #[inline] #[must_use] pub fn decode_aps_price(encoded: &str) -> Option { - use base64::{engine::general_purpose::STANDARD, Engine as _}; + use base64::{Engine as _, engine::general_purpose::STANDARD}; let decoded = STANDARD.decode(encoded).ok()?; let price_str = String::from_utf8(decoded).ok()?; diff --git a/crates/mocktioneer-core/src/mediation.rs b/crates/mocktioneer-core/src/mediation.rs index 9dff3fd..a072d98 100644 --- a/crates/mocktioneer-core/src/mediation.rs +++ b/crates/mocktioneer-core/src/mediation.rs @@ -4,7 +4,7 @@ //! and selects winners based on price (highest price wins). use crate::openrtb::{Bid as OpenRTBBid, Imp, MediaType, OpenRTBRequest, OpenRTBResponse, SeatBid}; -use crate::render::{extract_ec_info, iframe_html, CreativeMetadata, SignatureStatus}; +use crate::render::{CreativeMetadata, SignatureStatus, extract_ec_info, iframe_html}; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; use std::collections::BTreeMap; diff --git a/crates/mocktioneer-core/src/routes.rs b/crates/mocktioneer-core/src/routes.rs index 3f1a27e..c2407d9 100644 --- a/crates/mocktioneer-core/src/routes.rs +++ b/crates/mocktioneer-core/src/routes.rs @@ -10,7 +10,7 @@ use edgezero_core::extractor::{ ForwardedHost, FromRequest, Headers, ValidatedJson, ValidatedQuery, }; use edgezero_core::http::{ - header, response_builder, HeaderMap, HeaderValue, Method, Response, StatusCode, + HeaderMap, HeaderValue, Method, Response, StatusCode, header, response_builder, }; use edgezero_core::middleware::{Middleware, Next}; use edgezero_core::{body::Body, error::EdgeError}; @@ -23,10 +23,10 @@ use crate::aps::ApsBidRequest; use crate::auction::{ build_aps_response, build_openrtb_response, is_standard_size, standard_sizes, }; -use crate::mediation::{mediate_auction, MediationRequest}; +use crate::mediation::{MediationRequest, mediate_auction}; use crate::openrtb::OpenRTBRequest; use crate::render::{ - creative_html, extract_ec_hash, info_html, render_svg, render_template_str, SignatureStatus, + SignatureStatus, creative_html, extract_ec_hash, info_html, render_svg, render_template_str, }; use crate::verification::verify_request_id_signature; @@ -273,10 +273,10 @@ fn apply_cors(headers: &mut HeaderMap) { fn build_response(status: StatusCode, body: Body) -> Response { let mut builder = response_builder().status(status); - if let Body::Once(bytes) = &body { - if !bytes.is_empty() { - builder = builder.header(header::CONTENT_LENGTH, bytes.len().to_string()); - } + if let Body::Once(bytes) = &body + && !bytes.is_empty() + { + builder = builder.header(header::CONTENT_LENGTH, bytes.len().to_string()); } builder.body(body).unwrap_or_else(|_| { response_builder() @@ -391,10 +391,10 @@ pub async fn handle_static_creatives( fn parse_cookie<'cookie>(cookie_header: &'cookie str, name: &str) -> Option<&'cookie str> { for part in cookie_header.split(';') { let trimmed = part.trim(); - if let Some((key, value)) = trimmed.split_once('=') { - if key.trim() == name { - return Some(value.trim()); - } + if let Some((key, value)) = trimmed.split_once('=') + && key.trim() == name + { + return Some(value.trim()); } } None @@ -457,10 +457,10 @@ pub async fn handle_pixel( response_headers.insert(header::CONTENT_LENGTH, length_value); } - if let Some(cookie) = set_cookie { - if let Ok(value) = HeaderValue::from_str(&cookie) { - response.headers_mut().append("Set-Cookie", value); - } + if let Some(cookie) = set_cookie + && let Ok(value) = HeaderValue::from_str(&cookie) + { + response.headers_mut().append("Set-Cookie", value); } Ok(response) @@ -756,10 +756,10 @@ pub async fn handle_sync_start( HeaderValue::from_static("no-store, no-cache, must-revalidate, max-age=0"), ); - if let Some(cookie) = set_cookie { - if let Ok(value) = HeaderValue::from_str(&cookie) { - response.headers_mut().append("Set-Cookie", value); - } + if let Some(cookie) = set_cookie + && let Ok(value) = HeaderValue::from_str(&cookie) + { + response.headers_mut().append("Set-Cookie", value); } Ok(response) @@ -998,7 +998,7 @@ mod tests { use edgezero_core::body::Body; use edgezero_core::context::RequestContext; use edgezero_core::error::EdgeError; - use edgezero_core::http::{request_builder, Method, Response, StatusCode}; + use edgezero_core::http::{Method, Response, StatusCode, request_builder}; use edgezero_core::params::PathParams; use edgezero_core::response::IntoResponse as _; use futures::executor::block_on; @@ -1057,9 +1057,11 @@ mod tests { .unwrap(); assert_eq!(ct, "image/gif"); let cookies = response.headers().get_all("set-cookie"); - assert!(cookies - .iter() - .any(|value| value.to_str().unwrap_or_default().starts_with("mtkid="))); + assert!( + cookies + .iter() + .any(|value| value.to_str().unwrap_or_default().starts_with("mtkid=")) + ); } #[test] diff --git a/crates/mocktioneer-core/src/verification.rs b/crates/mocktioneer-core/src/verification.rs index 1bc3e35..7233840 100644 --- a/crates/mocktioneer-core/src/verification.rs +++ b/crates/mocktioneer-core/src/verification.rs @@ -1,4 +1,4 @@ -use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; +use base64::{Engine as _, engine::general_purpose::URL_SAFE_NO_PAD}; use ed25519_dalek::{Signature, Verifier as _, VerifyingKey}; use edgezero_core::body::Body; use edgezero_core::context::RequestContext; @@ -635,9 +635,10 @@ mod tests { )); let err = result.unwrap_err(); assert!(matches!(err, VerificationError::InvalidSignature(_))); - assert!(err - .to_string() - .contains("Missing ext.trusted_server.request_host")); + assert!( + err.to_string() + .contains("Missing ext.trusted_server.request_host") + ); } #[test] @@ -662,9 +663,10 @@ mod tests { )); let err = result.unwrap_err(); assert!(matches!(err, VerificationError::InvalidSignature(_))); - assert!(err - .to_string() - .contains("Missing ext.trusted_server.request_scheme")); + assert!( + err.to_string() + .contains("Missing ext.trusted_server.request_scheme") + ); } #[test] diff --git a/crates/mocktioneer-core/tests/aps_endpoints.rs b/crates/mocktioneer-core/tests/aps_endpoints.rs index 0aeff48..34ed22e 100644 --- a/crates/mocktioneer-core/tests/aps_endpoints.rs +++ b/crates/mocktioneer-core/tests/aps_endpoints.rs @@ -287,11 +287,13 @@ mod tests { assert_eq!(contextual.cfe, Some(true)); assert_eq!(contextual.ev, Some(true)); assert!(contextual.host.is_some()); - assert!(contextual - .host - .as_ref() - .unwrap() - .contains("mocktioneer.test")); + assert!( + contextual + .host + .as_ref() + .unwrap() + .contains("mocktioneer.test") + ); assert_eq!(contextual.cb, Some("6".to_owned())); assert_eq!( contextual.cfn, diff --git a/crates/mocktioneer-core/tests/endpoints.rs b/crates/mocktioneer-core/tests/endpoints.rs index 2759e62..259eb30 100644 --- a/crates/mocktioneer-core/tests/endpoints.rs +++ b/crates/mocktioneer-core/tests/endpoints.rs @@ -3,7 +3,7 @@ mod tests { use edgezero_core::app::App; use edgezero_core::body::Body; use edgezero_core::http::{ - header, request_builder, HeaderValue, Method, Request, Response, StatusCode, + HeaderValue, Method, Request, Response, StatusCode, header, request_builder, }; use futures::executor::block_on; From 4ea3005485ebc59ca5d40f46f7e2e1e06bfdc358 Mon Sep 17 00:00:00 2001 From: Aram Grigoryan <132480+aram356@users.noreply.github.com> Date: Mon, 13 Jul 2026 14:11:50 -0700 Subject: [PATCH 2/3] Updated authors --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 8dd0b6a..590c012 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = [ resolver = "2" [workspace.package] -authors = ["Mocktioneer Team "] +authors = ["Mocktioneer Team "] edition = "2024" license = "Apache-2.0" publish = false From 19a17813e748f8ca4a80310d1a93af56bf2698f1 Mon Sep 17 00:00:00 2001 From: Aram Grigoryan <132480+aram356@users.noreply.github.com> Date: Mon, 13 Jul 2026 14:25:40 -0700 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20PR=20#112=20review=20=E2=80=94=20Spi?= =?UTF-8?q?n=20adapter=20targets=20wasm32-wasip1,=20CLAUDE.md=20edition=20?= =?UTF-8?q?2024?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Spin description claimed wasm32-wasip2, but on main the adapter builds wasip1: spin-sdk is 5.2, edgezero.toml declares wasm32-wasip1, and the CI matrix runs the spin contract tests under wasip1 via wasmtime. wasip2 arrives with the spin-sdk 6 migration in #110, which adds its own wasip2 CI entry. Also update CLAUDE.md, which still declared Edition 2021. --- CLAUDE.md | 2 +- crates/mocktioneer-adapter-spin/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index f2af53c..85a2103 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -29,7 +29,7 @@ tests/playwright/ # Playwright e2e tests (creative visibility, s - **Rust**: 1.95.0 (from `.tool-versions`) - **Node.js**: 24.12.0 (for docs site and Playwright tests) - **Fastly CLI**: v13.0.0 -- **Edition**: 2021 +- **Edition**: 2024 - **Resolver**: 2 - **License**: Apache-2.0 diff --git a/crates/mocktioneer-adapter-spin/Cargo.toml b/crates/mocktioneer-adapter-spin/Cargo.toml index 41c5c69..d0a4a9c 100644 --- a/crates/mocktioneer-adapter-spin/Cargo.toml +++ b/crates/mocktioneer-adapter-spin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mocktioneer-adapter-spin" -description = "Spin / Fermyon adapter for Mocktioneer (wasm32-wasip2)." +description = "Spin / Fermyon adapter for Mocktioneer (wasm32-wasip1)." authors = { workspace = true } edition = { workspace = true } license = { workspace = true }