1use crate::fieldsets::{self, enums::*, Combo};
98use crate::options::*;
99
100#[derive(Debug, Copy, Clone, PartialEq, Eq)]
105#[cfg_attr(
106    all(feature = "serde", feature = "experimental"),
107    derive(serde::Serialize, serde::Deserialize)
108)]
109#[non_exhaustive]
110pub enum DateFields {
111    D,
114    MD,
117    YMD,
120    DE,
123    MDE,
126    YMDE,
129    E,
132    M,
135    YM,
138    Y,
141}
142
143impl DateFields {
144    pub const VALUES: &[Self] = &[
146        Self::D,
147        Self::MD,
148        Self::YMD,
149        Self::DE,
150        Self::MDE,
151        Self::YMDE,
152        Self::E,
153        Self::M,
154        Self::YM,
155        Self::Y,
156    ];
157
158    pub fn is_calendar_period(self) -> bool {
160        match self {
161            DateFields::D => false,
162            DateFields::MD => false,
163            DateFields::YMD => false,
164            DateFields::DE => false,
165            DateFields::MDE => false,
166            DateFields::YMDE => false,
167            DateFields::E => false,
168            DateFields::M => true,
169            DateFields::YM => true,
170            DateFields::Y => true,
171        }
172    }
173}
174
175#[derive(Debug, Copy, Clone, PartialEq, Eq)]
179#[cfg_attr(
180    all(feature = "serde", feature = "experimental"),
181    derive(serde::Serialize, serde::Deserialize)
182)]
183#[non_exhaustive]
184pub enum ZoneStyle {
185    SpecificLong,
188    SpecificShort,
191    LocalizedOffsetLong,
194    LocalizedOffsetShort,
197    GenericLong,
200    GenericShort,
203    Location,
206    ExemplarCity,
209}
210
211impl ZoneStyle {
212    pub const VALUES: &[Self] = &[
214        Self::SpecificLong,
215        Self::SpecificShort,
216        Self::LocalizedOffsetLong,
217        Self::LocalizedOffsetShort,
218        Self::GenericLong,
219        Self::GenericShort,
220        Self::Location,
221        Self::ExemplarCity,
222    ];
223}
224
225#[derive(Debug, Clone, displaydoc::Display)]
228#[ignore_extra_doc_attributes] #[non_exhaustive]
230pub enum BuilderError {
231    MissingDateFields,
236    MissingTimePrecision,
238    MissingZoneStyle,
240    InvalidDateFields,
248    SuperfluousOptions(FieldSetBuilder),
276}
277
278impl core::error::Error for BuilderError {}
279
280#[cfg(all(feature = "serde", feature = "experimental"))]
283mod _serde {
284    use super::*;
285    use serde::{Deserialize, Serialize};
286
287    #[derive(Serialize, Deserialize)]
288    #[serde(rename_all = "camelCase")]
289    struct FieldSetBuilderHuman {
290        #[serde(skip_serializing_if = "Option::is_none")]
291        pub length: Option<Length>,
292        #[serde(skip_serializing_if = "Option::is_none")]
293        pub date_fields: Option<DateFields>,
294        #[serde(skip_serializing_if = "Option::is_none")]
295        pub time_precision: Option<TimePrecision>,
296        #[serde(skip_serializing_if = "Option::is_none")]
297        pub zone_style: Option<ZoneStyle>,
298        #[serde(skip_serializing_if = "Option::is_none")]
299        pub alignment: Option<Alignment>,
300        #[serde(skip_serializing_if = "Option::is_none")]
301        pub year_style: Option<YearStyle>,
302    }
303
304    #[derive(Serialize)]
305    #[serde(rename_all = "camelCase")]
306    struct FieldSetBuilderMachine {
307        pub length: Option<Length>,
308        pub date_fields: Option<DateFields>,
309        pub time_precision: Option<TimePrecision>,
310        pub zone_style: Option<ZoneStyle>,
311        pub alignment: Option<Alignment>,
312        pub year_style: Option<YearStyle>,
313    }
314
315    impl Serialize for FieldSetBuilder {
343        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
344        where
345            S: serde::Serializer,
346        {
347            let FieldSetBuilder {
348                length,
349                date_fields,
350                time_precision,
351                zone_style,
352                alignment,
353                year_style,
354            } = *self;
355            if serializer.is_human_readable() {
356                FieldSetBuilderHuman {
357                    length,
358                    date_fields,
359                    time_precision,
360                    zone_style,
361                    alignment,
362                    year_style,
363                }
364                .serialize(serializer)
365            } else {
366                FieldSetBuilderMachine {
367                    length,
368                    date_fields,
369                    time_precision,
370                    zone_style,
371                    alignment,
372                    year_style,
373                }
374                .serialize(serializer)
375            }
376        }
377    }
378
379    impl<'de> Deserialize<'de> for FieldSetBuilder {
385        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
386        where
387            D: serde::Deserializer<'de>,
388        {
389            let FieldSetBuilderHuman {
392                length,
393                date_fields,
394                time_precision,
395                zone_style,
396                alignment,
397                year_style,
398            } = FieldSetBuilderHuman::deserialize(deserializer)?;
399            Ok(FieldSetBuilder {
400                length,
401                date_fields,
402                time_precision,
403                zone_style,
404                alignment,
405                year_style,
406            })
407        }
408    }
409}
410
411#[derive(Debug, Clone, PartialEq, Eq, Default)]
419#[non_exhaustive]
420pub struct FieldSetBuilder {
421    pub length: Option<Length>,
425    pub date_fields: Option<DateFields>,
429    pub time_precision: Option<TimePrecision>,
433    pub zone_style: Option<ZoneStyle>,
437    pub alignment: Option<Alignment>,
441    pub year_style: Option<YearStyle>,
445}
446
447enum DateOrCalendarPeriodFieldSet {
448    Date(DateFieldSet),
449    CalendarPeriod(CalendarPeriodFieldSet),
450}
451
452impl FieldSetBuilder {
453    pub fn new() -> Self {
455        Self::default()
456    }
457
458    fn build_date_or_calendar_period_without_checking_options(
459        &mut self,
460    ) -> Result<DateOrCalendarPeriodFieldSet, BuilderError> {
461        use DateOrCalendarPeriodFieldSet::*;
462        let field_set = match self.date_fields.take() {
463            Some(DateFields::D) => Date(DateFieldSet::D(fieldsets::D::take_from_builder(self))),
464            Some(DateFields::MD) => Date(DateFieldSet::MD(fieldsets::MD::take_from_builder(self))),
465            Some(DateFields::YMD) => {
466                Date(DateFieldSet::YMD(fieldsets::YMD::take_from_builder(self)))
467            }
468            Some(DateFields::DE) => Date(DateFieldSet::DE(fieldsets::DE::take_from_builder(self))),
469            Some(DateFields::MDE) => {
470                Date(DateFieldSet::MDE(fieldsets::MDE::take_from_builder(self)))
471            }
472            Some(DateFields::YMDE) => {
473                Date(DateFieldSet::YMDE(fieldsets::YMDE::take_from_builder(self)))
474            }
475            Some(DateFields::E) => Date(DateFieldSet::E(fieldsets::E::take_from_builder(self))),
476            Some(DateFields::M) => CalendarPeriod(CalendarPeriodFieldSet::M(
477                fieldsets::M::take_from_builder(self),
478            )),
479            Some(DateFields::YM) => CalendarPeriod(CalendarPeriodFieldSet::YM(
480                fieldsets::YM::take_from_builder(self),
481            )),
482            Some(DateFields::Y) => CalendarPeriod(CalendarPeriodFieldSet::Y(
483                fieldsets::Y::take_from_builder(self),
484            )),
485            Option::None => return Err(BuilderError::MissingDateFields),
486        };
487        Ok(field_set)
488    }
489
490    pub fn build_date(mut self) -> Result<DateFieldSet, BuilderError> {
494        let date_field_set = match self.build_date_or_calendar_period_without_checking_options()? {
495            DateOrCalendarPeriodFieldSet::Date(fs) => fs,
496            DateOrCalendarPeriodFieldSet::CalendarPeriod(_) => {
497                return Err(BuilderError::InvalidDateFields)
498            }
499        };
500        self.check_options_consumed()?;
501        Ok(date_field_set)
502    }
503
504    pub fn build_calendar_period(mut self) -> Result<CalendarPeriodFieldSet, BuilderError> {
508        let calendar_period_field_set = match self
509            .build_date_or_calendar_period_without_checking_options()?
510        {
511            DateOrCalendarPeriodFieldSet::Date(_) => return Err(BuilderError::InvalidDateFields),
512            DateOrCalendarPeriodFieldSet::CalendarPeriod(fs) => fs,
513        };
514        self.check_options_consumed()?;
515        Ok(calendar_period_field_set)
516    }
517
518    pub fn build_time(mut self) -> Result<TimeFieldSet, BuilderError> {
522        let time_field_set = TimeFieldSet::T(fieldsets::T::take_from_builder(&mut self));
523        self.check_options_consumed()?;
524        Ok(time_field_set)
525    }
526
527    fn build_zone_without_checking_options(&mut self) -> Result<ZoneFieldSet, BuilderError> {
528        let zone_field_set = match self.zone_style.take() {
529            Some(ZoneStyle::SpecificShort) => {
530                ZoneFieldSet::SpecificShort(fieldsets::zone::SpecificShort)
531            }
532            Some(ZoneStyle::SpecificLong) => {
533                ZoneFieldSet::SpecificLong(fieldsets::zone::SpecificLong)
534            }
535            Some(ZoneStyle::LocalizedOffsetLong) => {
536                ZoneFieldSet::LocalizedOffsetLong(fieldsets::zone::LocalizedOffsetLong)
537            }
538            Some(ZoneStyle::LocalizedOffsetShort) => {
539                ZoneFieldSet::LocalizedOffsetShort(fieldsets::zone::LocalizedOffsetShort)
540            }
541            Some(ZoneStyle::GenericLong) => ZoneFieldSet::GenericLong(fieldsets::zone::GenericLong),
542            Some(ZoneStyle::GenericShort) => {
543                ZoneFieldSet::GenericShort(fieldsets::zone::GenericShort)
544            }
545            Some(ZoneStyle::Location) => ZoneFieldSet::Location(fieldsets::zone::Location),
546            Some(ZoneStyle::ExemplarCity) => {
547                ZoneFieldSet::ExemplarCity(fieldsets::zone::ExemplarCity)
548            }
549            Option::None => return Err(BuilderError::MissingZoneStyle),
550        };
551        Ok(zone_field_set)
552    }
553
554    pub fn build_zone(mut self) -> Result<ZoneFieldSet, BuilderError> {
558        let zone_field_set = self.build_zone_without_checking_options()?;
559        self.check_options_consumed()?;
560        Ok(zone_field_set)
561    }
562
563    pub fn build_date_and_time(mut self) -> Result<DateAndTimeFieldSet, BuilderError> {
567        if self.time_precision.is_none() {
568            return Err(BuilderError::MissingTimePrecision);
569        }
570        let date_and_time_field_set = match self.date_fields.take() {
571            Some(DateFields::D) => {
572                DateAndTimeFieldSet::DT(fieldsets::DT::take_from_builder(&mut self))
573            }
574            Some(DateFields::MD) => {
575                DateAndTimeFieldSet::MDT(fieldsets::MDT::take_from_builder(&mut self))
576            }
577            Some(DateFields::YMD) => {
578                DateAndTimeFieldSet::YMDT(fieldsets::YMDT::take_from_builder(&mut self))
579            }
580            Some(DateFields::DE) => {
581                DateAndTimeFieldSet::DET(fieldsets::DET::take_from_builder(&mut self))
582            }
583            Some(DateFields::MDE) => {
584                DateAndTimeFieldSet::MDET(fieldsets::MDET::take_from_builder(&mut self))
585            }
586            Some(DateFields::YMDE) => {
587                DateAndTimeFieldSet::YMDET(fieldsets::YMDET::take_from_builder(&mut self))
588            }
589            Some(DateFields::E) => {
590                DateAndTimeFieldSet::ET(fieldsets::ET::take_from_builder(&mut self))
591            }
592            Some(DateFields::M) | Some(DateFields::YM) | Some(DateFields::Y) | Option::None => {
593                return Err(BuilderError::InvalidDateFields)
594            }
595        };
596        self.check_options_consumed()?;
597        Ok(date_and_time_field_set)
598    }
599
600    pub fn build_composite_datetime(mut self) -> Result<CompositeDateTimeFieldSet, BuilderError> {
604        match (self.date_fields.is_some(), self.time_precision.is_some()) {
606            (true, false) => {
607                let field_set = match self
608                    .build_date_or_calendar_period_without_checking_options()?
609                {
610                    DateOrCalendarPeriodFieldSet::Date(fs) => CompositeDateTimeFieldSet::Date(fs),
611                    DateOrCalendarPeriodFieldSet::CalendarPeriod(fs) => {
612                        CompositeDateTimeFieldSet::CalendarPeriod(fs)
613                    }
614                };
615                self.check_options_consumed()?;
616                Ok(field_set)
617            }
618            (false, true) => self.build_time().map(CompositeDateTimeFieldSet::Time),
619            (true, true) => self
620                .build_date_and_time()
621                .map(CompositeDateTimeFieldSet::DateTime),
622            (false, false) => Err(BuilderError::MissingDateFields),
623        }
624    }
625
626    pub fn build_zoned_date(mut self) -> Result<ZonedDateFieldSet, BuilderError> {
630        let zone_field_set = self.build_zone_without_checking_options()?;
631        let date_field_set = self.build_date()?;
632        Ok(date_field_set.with_zone(zone_field_set))
633    }
634
635    pub fn build_zoned_time(mut self) -> Result<ZonedTimeFieldSet, BuilderError> {
639        let zone_field_set = self.build_zone_without_checking_options()?;
640        let time_field_set = self.build_time()?;
641        Ok(time_field_set.with_zone(zone_field_set))
642    }
643
644    pub fn build_zoned_date_and_time(mut self) -> Result<ZonedDateAndTimeFieldSet, BuilderError> {
648        let zone_field_set = self.build_zone_without_checking_options()?;
649        let datetime_field_set = self.build_date_and_time()?;
650        Ok(datetime_field_set.with_zone(zone_field_set))
651    }
652
653    pub fn build_composite(mut self) -> Result<CompositeFieldSet, BuilderError> {
657        match (
659            self.date_fields.is_some(),
660            self.time_precision.is_some(),
661            self.zone_style.is_some(),
662        ) {
663            (true, false, false) => {
664                let field_set =
665                    match self.build_date_or_calendar_period_without_checking_options()? {
666                        DateOrCalendarPeriodFieldSet::Date(fs) => CompositeFieldSet::Date(fs),
667                        DateOrCalendarPeriodFieldSet::CalendarPeriod(fs) => {
668                            CompositeFieldSet::CalendarPeriod(fs)
669                        }
670                    };
671                self.check_options_consumed()?;
672                Ok(field_set)
673            }
674            (false, true, false) => self.build_time().map(CompositeFieldSet::Time),
675            (true, true, false) => self.build_date_and_time().map(CompositeFieldSet::DateTime),
676            (false, false, true) => self.build_zone().map(CompositeFieldSet::Zone),
677            (true, false, true) => {
678                let zone_field_set = self.build_zone_without_checking_options()?;
679                let date_field_set = self.build_date()?;
680                Ok(CompositeFieldSet::DateZone(Combo::new(
681                    date_field_set,
682                    zone_field_set,
683                )))
684            }
685            (false, true, true) => {
686                let zone_field_set = self.build_zone_without_checking_options()?;
687                let time_field_set = self.build_time()?;
688                Ok(CompositeFieldSet::TimeZone(Combo::new(
689                    time_field_set,
690                    zone_field_set,
691                )))
692            }
693            (true, true, true) => {
694                let zone_field_set = self.build_zone_without_checking_options()?;
695                let date_and_time_field_set = self.build_date_and_time()?;
696                Ok(CompositeFieldSet::DateTimeZone(Combo::new(
697                    date_and_time_field_set,
698                    zone_field_set,
699                )))
700            }
701            (false, false, false) => Err(BuilderError::MissingDateFields),
702        }
703    }
704
705    fn check_options_consumed(self) -> Result<(), BuilderError> {
706        if self != Self::default() {
707            Err(BuilderError::SuperfluousOptions(self))
708        } else {
709            Ok(())
710        }
711    }
712}
713
714#[cfg(test)]
715mod tests {
716    use super::*;
717
718    static DATE_FIELD_SETS: &[DateFields] = &[
719        DateFields::D,
720        DateFields::MD,
721        DateFields::YMD,
722        DateFields::DE,
723        DateFields::MDE,
724        DateFields::YMDE,
725        DateFields::E,
726    ];
727
728    static CALENDAR_PERIOD_FIELD_SETS: &[DateFields] =
729        &[DateFields::M, DateFields::YM, DateFields::Y];
730
731    static ZONE_STYLES: &[ZoneStyle] = &[
732        ZoneStyle::SpecificLong,
733        ZoneStyle::SpecificShort,
734        ZoneStyle::LocalizedOffsetLong,
735        ZoneStyle::LocalizedOffsetShort,
736        ZoneStyle::GenericLong,
737        ZoneStyle::GenericShort,
738        ZoneStyle::Location,
739        ZoneStyle::ExemplarCity,
740    ];
741
742    #[cfg(all(feature = "serde", feature = "experimental"))]
743    fn check_serde(value: &FieldSetBuilder) {
744        let json_str = serde_json::to_string(value).unwrap();
745        let json_parsed: FieldSetBuilder = serde_json::from_str(&json_str).unwrap();
746        assert_eq!(value, &json_parsed);
747        let bincode_bytes = bincode::serialize(value).unwrap();
748        let bincode_parsed: FieldSetBuilder = bincode::deserialize(&bincode_bytes).unwrap();
749        assert_eq!(value, &bincode_parsed);
750    }
751
752    #[test]
753    fn test_date_field_sets() {
754        for date_fields in DATE_FIELD_SETS.iter() {
755            let mut builder = FieldSetBuilder::new();
756            builder.date_fields = Some(*date_fields);
757            builder.clone().build_date().unwrap();
758            builder.clone().build_calendar_period().unwrap_err();
759            builder.clone().build_time().unwrap_err();
760            builder.clone().build_zone().unwrap_err();
761            builder.clone().build_date_and_time().unwrap_err();
762            builder.clone().build_composite_datetime().unwrap();
763            builder.clone().build_composite().unwrap();
764            #[cfg(all(feature = "serde", feature = "experimental"))]
765            check_serde(&builder);
766        }
767    }
768
769    #[test]
770    fn test_calendar_period_field_sets() {
771        for date_fields in CALENDAR_PERIOD_FIELD_SETS.iter() {
772            let mut builder = FieldSetBuilder::new();
773            builder.date_fields = Some(*date_fields);
774            builder.clone().build_date().unwrap_err();
775            builder.clone().build_calendar_period().unwrap();
776            builder.clone().build_time().unwrap_err();
777            builder.clone().build_zone().unwrap_err();
778            builder.clone().build_date_and_time().unwrap_err();
779            builder.clone().build_composite_datetime().unwrap();
780            builder.clone().build_composite().unwrap();
781            #[cfg(all(feature = "serde", feature = "experimental"))]
782            check_serde(&builder);
783        }
784    }
785
786    #[test]
787    fn test_time_field_sets() {
788        let mut builder = FieldSetBuilder::new();
789        builder.time_precision = Some(TimePrecision::Minute);
790        builder.clone().build_date().unwrap_err();
791        builder.clone().build_calendar_period().unwrap_err();
792        builder.clone().build_time().unwrap();
793        builder.clone().build_zone().unwrap_err();
794        builder.clone().build_date_and_time().unwrap_err();
795        builder.clone().build_composite_datetime().unwrap();
796        builder.clone().build_composite().unwrap();
797        #[cfg(all(feature = "serde", feature = "experimental"))]
798        check_serde(&builder);
799    }
800
801    #[test]
802    fn test_zone_field_sets() {
803        for zone_style in ZONE_STYLES.iter() {
804            let mut builder = FieldSetBuilder::new();
805            builder.zone_style = Some(*zone_style);
806            builder.clone().build_date().unwrap_err();
807            builder.clone().build_calendar_period().unwrap_err();
808            builder.clone().build_time().unwrap_err();
809            builder.clone().build_zone().unwrap();
810            builder.clone().build_date_and_time().unwrap_err();
811            builder.clone().build_composite_datetime().unwrap_err();
812            builder.clone().build_composite().unwrap();
813            #[cfg(all(feature = "serde", feature = "experimental"))]
814            check_serde(&builder);
815        }
816    }
817
818    #[test]
819    fn test_date_time_field_sets() {
820        for date_fields in DATE_FIELD_SETS.iter() {
821            let mut builder = FieldSetBuilder::new();
822            builder.date_fields = Some(*date_fields);
823            builder.time_precision = Some(TimePrecision::Minute);
824            builder.clone().build_date().unwrap_err();
825            builder.clone().build_calendar_period().unwrap_err();
826            builder.clone().build_time().unwrap_err();
827            builder.clone().build_zone().unwrap_err();
828            builder.clone().build_date_and_time().unwrap();
829            builder.clone().build_composite_datetime().unwrap();
830            builder.clone().build_composite().unwrap();
831            #[cfg(all(feature = "serde", feature = "experimental"))]
832            check_serde(&builder);
833        }
834    }
835
836    #[test]
837    fn test_calendar_period_time_field_sets() {
838        for date_fields in CALENDAR_PERIOD_FIELD_SETS.iter() {
840            let mut builder = FieldSetBuilder::new();
841            builder.date_fields = Some(*date_fields);
842            builder.time_precision = Some(TimePrecision::Minute);
843            builder.clone().build_date().unwrap_err();
844            builder.clone().build_calendar_period().unwrap_err();
845            builder.clone().build_time().unwrap_err();
846            builder.clone().build_zone().unwrap_err();
847            builder.clone().build_date_and_time().unwrap_err();
848            builder.clone().build_composite_datetime().unwrap_err();
849            builder.clone().build_composite().unwrap_err();
850            #[cfg(all(feature = "serde", feature = "experimental"))]
851            check_serde(&builder);
852        }
853    }
854
855    #[test]
856    fn test_date_zone_field_sets() {
857        for date_fields in DATE_FIELD_SETS.iter() {
858            for zone_style in ZONE_STYLES.iter() {
859                let mut builder = FieldSetBuilder::new();
860                builder.date_fields = Some(*date_fields);
861                builder.zone_style = Some(*zone_style);
862                builder.clone().build_date().unwrap_err();
863                builder.clone().build_calendar_period().unwrap_err();
864                builder.clone().build_time().unwrap_err();
865                builder.clone().build_zone().unwrap_err();
866                builder.clone().build_date_and_time().unwrap_err();
867                builder.clone().build_composite_datetime().unwrap_err();
868                builder.clone().build_composite().unwrap();
869                #[cfg(all(feature = "serde", feature = "experimental"))]
870                check_serde(&builder);
871            }
872        }
873    }
874
875    #[test]
876    fn test_calendar_period_zone_field_sets() {
877        for date_fields in CALENDAR_PERIOD_FIELD_SETS.iter() {
879            for zone_style in ZONE_STYLES.iter() {
880                let mut builder = FieldSetBuilder::new();
881                builder.date_fields = Some(*date_fields);
882                builder.zone_style = Some(*zone_style);
883                builder.clone().build_date().unwrap_err();
884                builder.clone().build_calendar_period().unwrap_err();
885                builder.clone().build_time().unwrap_err();
886                builder.clone().build_zone().unwrap_err();
887                builder.clone().build_date_and_time().unwrap_err();
888                builder.clone().build_composite_datetime().unwrap_err();
889                builder.clone().build_composite().unwrap_err();
890                #[cfg(all(feature = "serde", feature = "experimental"))]
891                check_serde(&builder);
892            }
893        }
894    }
895
896    #[test]
897    fn test_time_zone_field_sets() {
898        for zone_style in ZONE_STYLES.iter() {
899            let mut builder = FieldSetBuilder::new();
900            builder.time_precision = Some(TimePrecision::Minute);
901            builder.zone_style = Some(*zone_style);
902            builder.clone().build_date().unwrap_err();
903            builder.clone().build_calendar_period().unwrap_err();
904            builder.clone().build_time().unwrap_err();
905            builder.clone().build_zone().unwrap_err();
906            builder.clone().build_date_and_time().unwrap_err();
907            builder.clone().build_composite_datetime().unwrap_err();
908            builder.clone().build_composite().unwrap();
909            #[cfg(all(feature = "serde", feature = "experimental"))]
910            check_serde(&builder);
911        }
912    }
913
914    #[test]
915    fn test_date_time_zone_field_sets() {
916        for date_fields in DATE_FIELD_SETS.iter() {
917            for zone_style in ZONE_STYLES.iter() {
918                let mut builder = FieldSetBuilder::new();
919                builder.date_fields = Some(*date_fields);
920                builder.time_precision = Some(TimePrecision::Minute);
921                builder.zone_style = Some(*zone_style);
922                builder.clone().build_date().unwrap_err();
923                builder.clone().build_calendar_period().unwrap_err();
924                builder.clone().build_time().unwrap_err();
925                builder.clone().build_zone().unwrap_err();
926                builder.clone().build_date_and_time().unwrap_err();
927                builder.clone().build_composite_datetime().unwrap_err();
928                builder.clone().build_composite().unwrap();
929                #[cfg(all(feature = "serde", feature = "experimental"))]
930                check_serde(&builder);
931            }
932        }
933    }
934
935    #[test]
936    fn test_calendar_period_time_zone_field_sets() {
937        for date_fields in CALENDAR_PERIOD_FIELD_SETS.iter() {
939            for zone_style in ZONE_STYLES.iter() {
940                let mut builder = FieldSetBuilder::new();
941                builder.date_fields = Some(*date_fields);
942                builder.time_precision = Some(TimePrecision::Minute);
943                builder.zone_style = Some(*zone_style);
944                builder.clone().build_date().unwrap_err();
945                builder.clone().build_calendar_period().unwrap_err();
946                builder.clone().build_time().unwrap_err();
947                builder.clone().build_zone().unwrap_err();
948                builder.clone().build_date_and_time().unwrap_err();
949                builder.clone().build_composite_datetime().unwrap_err();
950                builder.clone().build_composite().unwrap_err();
951                #[cfg(all(feature = "serde", feature = "experimental"))]
952                check_serde(&builder);
953            }
954        }
955    }
956}