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}