• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zbraniecki / icu4x / 6815798908

09 Nov 2023 05:17PM CUT coverage: 72.607% (-2.4%) from 75.01%
6815798908

push

github

web-flow
Implement `Any/BufferProvider` for some smart pointers (#4255)

Allows storing them as a `Box<dyn Any/BufferProvider>` without using a
wrapper type that implements the trait.

44281 of 60987 relevant lines covered (72.61%)

201375.86 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

80.85
/components/datetime/src/format/zoned_datetime.rs
1
// This file is part of ICU4X. For terms of use, please see the file
2
// called LICENSE at the top level of the ICU4X source tree
3
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4

5
//! A collection of code for formatting DateTimes with time zones.
6

7
use crate::error::DateTimeError as Error;
8
use crate::fields::{self, FieldSymbol};
9
use crate::input::{
10
    DateTimeInput, DateTimeInputWithWeekConfig, ExtractedDateTimeInput, ExtractedTimeZoneInput,
11
    LocalizedDateTimeInput, TimeZoneInput,
12
};
13
use crate::pattern::{runtime, PatternItem};
14
use crate::{raw, FormattedTimeZone};
15
use core::fmt;
16
use writeable::Writeable;
17

18
use super::datetime;
19

20
#[cfg(doc)]
21
use crate::ZonedDateTimeFormatter;
22

23
/// [`FormattedTimeZone`] is a intermediate structure which can be retrieved
24
/// as an output from [`ZonedDateTimeFormatter`].
25
#[derive(Debug)]
×
26
pub struct FormattedZonedDateTime<'l> {
27
    pub(crate) zoned_datetime_format: &'l raw::ZonedDateTimeFormatter,
×
28
    pub(crate) datetime: ExtractedDateTimeInput,
×
29
    pub(crate) time_zone: ExtractedTimeZoneInput,
×
30
}
31

32
impl<'l> Writeable for FormattedZonedDateTime<'l> {
33
    fn write_to<W: fmt::Write + ?Sized>(&self, sink: &mut W) -> fmt::Result {
135✔
34
        write_pattern(
135✔
35
            self.zoned_datetime_format,
135✔
36
            &self.datetime,
135✔
37
            &self.time_zone,
135✔
38
            sink,
39
        )
40
        .map_err(|_| core::fmt::Error)
×
41
    }
135✔
42

43
    // TODO(#489): Implement writeable_length_hint
44
}
45

46
impl<'l> fmt::Display for FormattedZonedDateTime<'l> {
47
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
133✔
48
        write_pattern(
133✔
49
            self.zoned_datetime_format,
133✔
50
            &self.datetime,
133✔
51
            &self.time_zone,
133✔
52
            f,
53
        )
54
        .map_err(|_| core::fmt::Error)
×
55
    }
133✔
56
}
57

58
pub(crate) fn write_pattern<D, Z, W>(
268✔
59
    zoned_datetime_format: &raw::ZonedDateTimeFormatter,
60
    datetime: &D,
61
    time_zone: &Z,
62
    w: &mut W,
63
) -> Result<(), Error>
64
where
65
    D: DateTimeInput,
66
    Z: TimeZoneInput,
67
    W: fmt::Write + ?Sized,
68
{
69
    let patterns = &zoned_datetime_format.datetime_format.patterns;
268✔
70
    let loc_datetime = DateTimeInputWithWeekConfig::new(
268✔
71
        datetime,
72
        zoned_datetime_format.datetime_format.week_data.as_ref(),
268✔
73
    );
74

75
    let pattern = patterns.get().0.select(
536✔
76
        &loc_datetime,
77
        zoned_datetime_format.datetime_format.ordinal_rules.as_ref(),
268✔
78
    )?;
×
79

80
    let mut iter = pattern.items.iter().peekable();
268✔
81
    loop {
82
        match iter.next() {
1,576✔
83
            Some(PatternItem::Field(field)) => write_field(
1,360✔
84
                pattern,
85
                field,
680✔
86
                iter.peek(),
680✔
87
                zoned_datetime_format,
88
                &loc_datetime,
89
                time_zone,
90
                w,
91
            )?,
×
92
            Some(PatternItem::Literal(ch)) => w.write_char(ch)?,
628✔
93
            None => break,
94
        }
95
    }
96
    Ok(())
268✔
97
}
268✔
98

99
fn write_field<D, Z, W>(
680✔
100
    pattern: &runtime::Pattern,
101
    field: fields::Field,
102
    next_item: Option<&PatternItem>,
103
    zoned_datetime_format: &raw::ZonedDateTimeFormatter,
104
    loc_datetime: &impl LocalizedDateTimeInput<D>,
105
    time_zone: &Z,
106
    w: &mut W,
107
) -> Result<(), Error>
108
where
109
    D: DateTimeInput,
110
    Z: TimeZoneInput,
111
    W: fmt::Write + ?Sized,
112
{
113
    let date_symbols = zoned_datetime_format
680✔
114
        .datetime_format
115
        .date_symbols
116
        .as_ref()
117
        .map(|s| s.get());
374✔
118

119
    let time_symbols = zoned_datetime_format
680✔
120
        .datetime_format
121
        .time_symbols
122
        .as_ref()
123
        .map(|s| s.get());
226✔
124

125
    match field.symbol {
680✔
126
        FieldSymbol::TimeZone(_time_zone) => FormattedTimeZone {
262✔
127
            time_zone_format: &zoned_datetime_format.time_zone_format,
128
            time_zone,
129
        }
130
        .write_to(w)?,
131
        _ => datetime::write_field(
418✔
132
            pattern,
133
            field,
418✔
134
            next_item,
135
            date_symbols,
136
            time_symbols,
137
            loc_datetime,
138
            &zoned_datetime_format.datetime_format.fixed_decimal_format,
418✔
139
            w,
140
        )?,
×
141
    }
142
    Ok(())
680✔
143
}
680✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc