pub struct Caveat<T, K: Kind> { /* private fields */ }Expand description
A value that may have associated Warnings.
Even though the value has been created there may be certain caveats you should be aware of before using it.
Implementations§
Source§impl<T, K> Caveat<T, K>where
K: Kind,
impl<T, K> Caveat<T, K>where
K: Kind,
Sourcepub fn into_parts(self) -> (T, Set<K>)
pub fn into_parts(self) -> (T, Set<K>)
Return the value and any Warnings stored in the Caveat.
Examples found in repository?
examples/generate_cdr_from_tariff.rs (line 43)
11fn main() {
12 const TARIFF_JSON: &str = include_str!(
13 "../test_data/v211/real_world/time_and_parking_time_separate_tariff/tariff.json"
14 );
15
16 let report = tariff::parse_and_report(TARIFF_JSON).unwrap();
17 let guess::Report {
18 unexpected_fields,
19 version,
20 } = report;
21
22 if !unexpected_fields.is_empty() {
23 eprintln!("Strange... there are fields in the tariff that are not defined in the spec.");
24
25 for path in &unexpected_fields {
26 eprintln!(" * {path}");
27 }
28
29 eprintln!();
30 }
31
32 let tariff = version.certain_or(Version::V221);
33
34 let config = generate::Config {
35 timezone: chrono_tz::Europe::Amsterdam,
36 start_date_time: DateTime::<Utc>::from_str("2025-06-12 18:22:33+00:00").unwrap(),
37 end_date_time: DateTime::<Utc>::from_str("2025-06-12 22:33:44+00:00").unwrap(),
38 max_current_supply_amp: Decimal::from(4),
39 max_energy_battery_kwh: Decimal::from(24),
40 max_power_supply_kw: Decimal::from(80),
41 };
42 let report = cdr::generate_from_tariff(&tariff, config).unwrap();
43 let (report, warnings) = report.into_parts();
44
45 print_warnings(&tariff, &warnings);
46
47 let generate::Report {
48 tariff_id,
49 tariff_currency_code,
50 partial_cdr,
51 } = report;
52
53 println!("CDR genereated for tariff with id: `{tariff_id}` and currency code: `{tariff_currency_code}`");
54 println!("{partial_cdr:#?}");
55}More examples
examples/price_cdr_with_known_version.rs (line 30)
8fn main() {
9 const CDR_JSON: &str =
10 include_str!("../test_data/v211/real_world/time_and_parking_time/cdr.json");
11
12 // If you know the version and timezone of a CDR you simply pass them into the `cdr::parse_with_version` fn.
13 let report = cdr::parse_with_version(CDR_JSON, Version::V211).expect("unable to parse CDR");
14 let cdr::ParseReport {
15 cdr,
16 unexpected_fields,
17 } = report;
18
19 if !unexpected_fields.is_empty() {
20 eprintln!("Strange... there are fields in the CDR that are not defined in the spec.");
21
22 for path in &unexpected_fields {
23 eprintln!("{path}");
24 }
25 }
26
27 let report = cdr::price(&cdr, price::TariffSource::UseCdr, Tz::Europe__Amsterdam)
28 .expect("unable to price CDR JSON");
29
30 let (report, warnings) = report.into_parts();
31 print_pricing_warnings(&cdr, &warnings);
32
33 // The various fields of the `price::Report` can be examined or converted to JSON.
34 let price::Report {
35 periods: _,
36 tariff_used: _,
37 tariff_reports: _,
38 timezone: _,
39 billed_energy: _,
40 billed_parking_time: _,
41 total_charging_time: _,
42 billed_charging_time: _,
43 total_cost: _,
44 total_fixed_cost: _,
45 total_time: _,
46 total_time_cost: _,
47 total_energy: _,
48 total_energy_cost: _,
49 total_parking_time: _,
50 total_parking_cost: _,
51 total_reservation_cost: _,
52 } = report;
53}examples/price_cdr_with_unknown_version.rs (line 21)
6fn main() {
7 const CDR_JSON: &str =
8 include_str!("../test_data/v211/real_world/time_and_parking_time/cdr.json");
9
10 // First the raw JSON should be parsed into a `cdr::Versioned` object.
11 // The `cdr::Report` returned from calling `cdr::parse` contains a `cdr::Versioned` object
12 // and a potential list of unexpected fields based on the OCPI v221 spec.
13 let cdr = cdr::parse(CDR_JSON).expect("Unable to parse CDR JSON");
14
15 // The guessed Version can be either certain or uncertain.
16 // In this case we discard the CDR object and try to convert it into a version.
17 // If the version is uncertain then fallback to presuming the CDR is v211.
18 let cdr = cdr.certain_or(Version::V211);
19
20 // The timezone can be inferred or found in the CDR, but a versioned CDR is required.
21 let (timezone_source, warnings) = timezone::find_or_infer(&cdr).into_parts();
22
23 let Some(timezone_source) = timezone_source else {
24 eprintln!("Unable to infer timezone");
25 print_timezone_warnings(&cdr, &warnings);
26 return;
27 };
28
29 if !warnings.is_empty() {
30 print_timezone_warnings(&cdr, &warnings);
31 }
32
33 // We don't care whether the timezone was found or inferred.
34 let timezone = timezone_source.into_timezone();
35 let report = cdr::parse_with_version(CDR_JSON, Version::V211).expect("unable to parse CDR");
36 let cdr::ParseReport {
37 cdr,
38 unexpected_fields,
39 } = report;
40
41 if !unexpected_fields.is_empty() {
42 eprintln!("Strange... there are fields in the CDR that are not defined in the spec.");
43
44 for path in &unexpected_fields {
45 eprintln!("{path}");
46 }
47 }
48
49 let report =
50 cdr::price(&cdr, price::TariffSource::UseCdr, timezone).expect("unable to price CDR JSON");
51 let (report, warnings) = report.into_parts();
52
53 print_pricing_warnings(&cdr, &warnings);
54
55 // The various fields of the `price::Report` can be examined or converted to JSON.
56 let price::Report {
57 periods: _,
58 tariff_used: _,
59 tariff_reports: _,
60 timezone: _,
61 billed_energy: _,
62 billed_parking_time: _,
63 total_charging_time: _,
64 billed_charging_time: _,
65 total_cost: _,
66 total_fixed_cost: _,
67 total_time: _,
68 total_time_cost: _,
69 total_energy: _,
70 total_energy_cost: _,
71 total_parking_time: _,
72 total_parking_cost: _,
73 total_reservation_cost: _,
74 } = report;
75}Sourcepub fn ignore_warnings(self) -> T
pub fn ignore_warnings(self) -> T
Return the value and drop any warnings contained within.
Trait Implementations§
Source§impl<T, K> Deref for Caveat<T, K>where
K: Kind,
A Caveat is simply a value with associated warnings.
Providing an impl Deref makes sense for given that it’s an annotated value.
impl<T, K> Deref for Caveat<T, K>where
K: Kind,
A Caveat is simply a value with associated warnings.
Providing an impl Deref makes sense for given that it’s an annotated value.
The same advice applies to both deref traits. In general, deref traits should be implemented if:
- a value of the type transparently behaves like a value of the target type;
- the implementation of the deref function is cheap; and
- users of the type will not be surprised by any deref coercion behavior.
See: https://doc.rust-lang.org/std/ops/trait.Deref.html#when-to-implement-deref-or-derefmut
Auto Trait Implementations§
impl<T, K> Freeze for Caveat<T, K>where
T: Freeze,
impl<T, K> RefUnwindSafe for Caveat<T, K>where
T: RefUnwindSafe,
K: RefUnwindSafe,
impl<T, K> Send for Caveat<T, K>where
T: Send,
impl<T, K> Sync for Caveat<T, K>where
T: Sync,
impl<T, K> Unpin for Caveat<T, K>
impl<T, K> UnwindSafe for Caveat<T, K>where
T: UnwindSafe,
K: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more