From f7e7a7e4b01dc5b6e2ed9eb662ac341cc037eebe Mon Sep 17 00:00:00 2001 From: Christian Date: Mon, 2 Mar 2026 13:09:40 +0000 Subject: [PATCH 1/3] wip on openrtb-full-implementation --- Cargo.lock | 8 + Cargo.toml | 1 + crates/openrtb/Cargo.toml | 14 + crates/openrtb/src/lib.rs | 847 ++++++++++++++++++++++++++++++++++++++ openrtb.md | 625 ++++++++++++++++++++++++++++ 5 files changed, 1495 insertions(+) create mode 100644 crates/openrtb/Cargo.toml create mode 100644 crates/openrtb/src/lib.rs create mode 100644 openrtb.md diff --git a/Cargo.lock b/Cargo.lock index 476fe08a..f7f4e359 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2438,6 +2438,14 @@ dependencies = [ "which", ] +[[package]] +name = "trusted-server-openrtb" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "typeid" version = "1.0.3" diff --git a/Cargo.toml b/Cargo.toml index d2113599..914ab2c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "crates/common", "crates/fastly", "crates/js", + "crates/openrtb", ] # Build defaults exclude the web-only tsjs crate, which is compiled via wasm-pack. diff --git a/crates/openrtb/Cargo.toml b/crates/openrtb/Cargo.toml new file mode 100644 index 00000000..221cec15 --- /dev/null +++ b/crates/openrtb/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "trusted-server-openrtb" +version = "0.1.0" +authors = [] +edition = "2021" +publish = false +license = "Apache-2.0" + +[lints] +workspace = true + +[dependencies] +serde = { workspace = true } +serde_json = { workspace = true } diff --git a/crates/openrtb/src/lib.rs b/crates/openrtb/src/lib.rs new file mode 100644 index 00000000..69da7bf7 --- /dev/null +++ b/crates/openrtb/src/lib.rs @@ -0,0 +1,847 @@ +//! `OpenRTB` 2.6 request and response data model. + +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value}; + +pub type Object = Map; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct BidRequest { + pub id: String, + pub imp: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub site: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub app: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub device: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub user: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub test: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub at: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub tmax: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub wseat: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub bseat: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub allimps: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub cur: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub wlang: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub wlangb: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub bcat: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub cattax: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub badv: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub bapp: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub source: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub regs: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub ext: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Source { + #[serde(skip_serializing_if = "Option::is_none")] + pub fd: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub tid: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub pchain: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub schain: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub ext: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Regs { + #[serde(skip_serializing_if = "Option::is_none")] + pub coppa: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub gdpr: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub us_privacy: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub ext: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Imp { + pub id: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub metric: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub banner: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub video: Option