price_cdr_with_unknown_version/
price_cdr_with_unknown_version.rs1#![expect(clippy::expect_used, reason = "examples can panic")]
2#![expect(clippy::print_stderr, reason = "examples can log to stderr")]
3
4use ocpi_tariffs::{cdr, json, price, timezone, warning, Version};
5
6fn main() {
7 const CDR_JSON: &str = include_str!("data/cdr_time_and_parking_time.json");
8
9 let cdr = json::parse_object(CDR_JSON).expect("Unable to parse CDR JSON");
13 let cdr = cdr::infer_version(cdr);
14
15 let cdr = cdr.certain_or(Version::V211);
18 let cdr = cdr::build_versioned(cdr).ignore_warnings();
19
20 let timezone = match timezone::find_or_infer(&cdr) {
22 Ok(tz) => tz,
23 Err(err_set) => {
24 let (error, warnings) = err_set.into_parts();
25 eprintln!("Unable to infer timezone");
26 print_timezone_error(&error);
27 print_timezone_warnings(&warnings);
28 return;
29 }
30 };
31 let (timezone_source, warnings) = timezone.into_parts();
32
33 if !warnings.is_empty() {
34 print_timezone_warnings(&warnings);
35 }
36
37 let timezone = timezone_source.into_timezone();
39
40 let report = match cdr::price(&cdr, price::TariffSource::UseCdr, timezone) {
41 Ok(r) => r,
42 Err(set) => {
43 let (error, warnings) = set.into_parts();
44 print_pricing_error(&error);
45 print_pricing_warnings(&warnings);
46 return;
47 }
48 };
49
50 let (report, warnings) = report.into_parts();
51
52 print_pricing_warnings(&warnings);
53
54 let price::Report {
56 periods: _,
57 tariff_used: _,
58 tariff_reports: _,
59 timezone: _,
60 billed_energy: _,
61 billed_idle_time: _,
62 total_charging_time: _,
63 billed_charging_time: _,
64 total_cost: _,
65 total_fixed_cost: _,
66 total_time: _,
67 total_charging_time_cost: _,
68 total_energy: _,
69 total_energy_cost: _,
70 total_idle_time: _,
71 total_idle_cost: _,
72 } = report;
73}
74
75fn print_timezone_error(error: &warning::Error<timezone::Warning>) {
77 eprintln!(
78 "ERR: Unable to find timezone due to error at path `{}`: {}",
79 error.element().path,
80 error.warning()
81 );
82}
83
84fn print_timezone_warnings(warnings: &warning::Set<timezone::Warning>) {
86 if warnings.is_empty() {
87 return;
88 }
89
90 eprintln!(
91 "WARN: {} warnings from the timezone search",
92 warnings.len_warnings()
93 );
94
95 eprintln!(
96 "WARN: {} warnings from the timezone search:\n {}",
97 warnings.len_warnings(),
98 warning::SetWriter::new(warnings)
99 );
100}
101
102fn print_pricing_error(error: &warning::Error<price::Warning>) {
104 eprintln!(
105 "ERR: Unable to price CDR due to error at path `{}`: {}",
106 error.element().path,
107 error.warning()
108 );
109}
110
111fn print_pricing_warnings(warnings: &warning::Set<price::Warning>) {
113 if warnings.is_empty() {
114 return;
115 }
116
117 eprintln!(
118 "WARN: {} warnings from the linting:\n {}",
119 warnings.len_warnings(),
120 warning::SetWriter::new(warnings)
121 );
122}