1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//! Tyres (EU ESPR Working Plan 2025-2030, mandate ~2029).
use serde::{Deserialize, Serialize};
use crate::identifier::ProductIdentifier;
/// Tyre product group data for EU tyre labelling compliance.
///
/// Per EU Regulation 2020/740 (effective 1 May 2021, replacing 1222/2009).
/// Fuel efficiency and wet grip classes use the A–E scale (5 classes).
/// The old A–G scale from Regulation 1222/2009 was retired in May 2021.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct TyreData {
/// The unique product identifier for the tyre model, in whichever EN 18219
/// clause 5 scheme issued it — a 14-digit GTIN under scheme 1.
pub product_identifier: ProductIdentifier,
/// Tyre class per EU 2020/740: `"C1"` (passenger cars), `"C2"` (vans/light trucks), `"C3"` (heavy trucks).
pub tyre_class: String,
/// Fuel efficiency class **A–E** per EU 2020/740 (A = lowest rolling resistance).
/// NOTE: the old A–G scale (Regulation 1222/2009) was replaced on 1 May 2021.
pub fuel_efficiency_class: String,
/// Wet grip class **A–E** per EU 2020/740 (A = shortest stopping distance on wet road).
pub wet_grip_class: String,
/// External rolling noise in decibels (dB), measured per UN ECE R117.
pub external_rolling_noise_db: f64,
/// Noise performance class **A/B/C** per EU 2020/740 Annex I.
/// A = significantly below the noise limit; B = below limit; C = at or above limit.
#[serde(skip_serializing_if = "Option::is_none")]
pub noise_performance_class: Option<String>,
/// Rolling resistance coefficient in N/kN.
#[serde(skip_serializing_if = "Option::is_none")]
pub rolling_resistance_n_per_kn: Option<f64>,
/// Recycled rubber content as a percentage of total rubber weight.
#[serde(skip_serializing_if = "Option::is_none")]
pub recycled_rubber_pct: Option<f64>,
/// Carbon footprint in kg CO₂e per tyre unit.
#[serde(skip_serializing_if = "Option::is_none")]
pub co2e_per_tyre_kg: Option<f64>,
}
impl crate::product_group::payload::ProductGroupPayload for TyreData {
fn product_identifier(&self) -> Option<&crate::identifier::ProductIdentifier> {
Some(&self.product_identifier)
}
/// This act defines no model identifier.
fn model_identifier(&self) -> Option<&str> {
None
}
/// This act's schema declares no substances-of-concern field.
fn svhc_substances(&self) -> Option<&[crate::product_group::SvhcSubstance]> {
None
}
/// Reg. (EU) 2020/740's C1/C2/C3 classes. Constrained by the `tyreClass`
/// enum in this group's schema. Not the fuel-efficiency or wet-grip class:
/// those grade a tyre within its class rather than saying which it is.
fn product_category(&self) -> Option<&str> {
Some(&self.tyre_class)
}
}