Move DateDurationUnit to options, document weeks behavior (#7732)

This is an option, it should be in options.

"weeks" is interesting since it is not possible to get weeks out of
`until` _unless_ you specifically ask for them. I've documented this on
DateDifferenceOptions. We could also document it on DateDurationUnit.
diff --git a/components/calendar/benches/until.rs b/components/calendar/benches/until.rs
index 063de0e..cad41b2 100644
--- a/components/calendar/benches/until.rs
+++ b/components/calendar/benches/until.rs
@@ -5,8 +5,8 @@
 use criterion::{
     black_box, criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion,
 };
-use icu_calendar::options::DateDifferenceOptions;
-use icu_calendar::types::{DateDurationUnit, RataDie};
+use icu_calendar::options::{DateDifferenceOptions, DateDurationUnit};
+use icu_calendar::types::RataDie;
 use icu_calendar::{Calendar, Date};
 
 #[macro_use]
diff --git a/components/calendar/fuzz/fuzz_targets/until.rs b/components/calendar/fuzz/fuzz_targets/until.rs
index bc0c140..60eb617 100644
--- a/components/calendar/fuzz/fuzz_targets/until.rs
+++ b/components/calendar/fuzz/fuzz_targets/until.rs
@@ -28,7 +28,7 @@
     Days,
 }
 
-impl From<DateDurationUnit> for icu_calendar::types::DateDurationUnit {
+impl From<DateDurationUnit> for icu_calendar::options::DateDurationUnit {
     fn from(other: DateDurationUnit) -> Self {
         match other {
             DateDurationUnit::Years => Self::Years,
diff --git a/components/calendar/src/calendar_arithmetic.rs b/components/calendar/src/calendar_arithmetic.rs
index 2f68a5d..64bc1b8 100644
--- a/components/calendar/src/calendar_arithmetic.rs
+++ b/components/calendar/src/calendar_arithmetic.rs
@@ -4,12 +4,12 @@
 
 use calendrical_calculations::rata_die::RataDie;
 
-use crate::duration::{DateDuration, DateDurationUnit};
+use crate::duration::DateDuration;
 use crate::error::{
     range_check, DateAddError, DateFromFieldsError, EcmaReferenceYearError, LunisolarDateError,
     MonthCodeParseError, MonthError, UnknownEraError,
 };
-use crate::options::{DateAddOptions, DateDifferenceOptions};
+use crate::options::{DateAddOptions, DateDifferenceOptions, DateDurationUnit};
 use crate::options::{DateFromFieldsOptions, MissingFieldsStrategy, Overflow};
 use crate::types::{DateFields, Month};
 use crate::{types, Calendar, DateError, RangeError};
diff --git a/components/calendar/src/duration.rs b/components/calendar/src/duration.rs
index 9e00f80..b9c4082 100644
--- a/components/calendar/src/duration.rs
+++ b/components/calendar/src/duration.rs
@@ -20,7 +20,7 @@
 /// ```rust
 /// use icu::calendar::options::DateDifferenceOptions;
 /// use icu::calendar::types::DateDuration;
-/// use icu::calendar::types::DateDurationUnit;
+/// use icu::calendar::options::DateDurationUnit;
 /// use icu::calendar::types::Weekday;
 /// use icu::calendar::Date;
 ///
@@ -135,30 +135,6 @@
     pub days: u64,
 }
 
-/// A "duration unit" used to specify the minimum or maximum duration of time to
-/// care about
-///
-/// <div class="stab unstable">
-/// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
-/// including in SemVer minor releases. Do not use this type unless you are prepared for things to occasionally break.
-///
-/// Graduation tracking issue: [issue #3964](https://github.com/unicode-org/icu4x/issues/3964).
-/// </div>
-///
-/// ✨ *Enabled with the `unstable` Cargo feature.*
-#[derive(Copy, Clone, Eq, PartialEq, Debug)]
-#[allow(clippy::exhaustive_enums)] // this type should be stable
-pub enum DateDurationUnit {
-    /// Duration in years
-    Years,
-    /// Duration in months
-    Months,
-    /// Duration in weeks
-    Weeks,
-    /// Duration in days
-    Days,
-}
-
 impl DateDuration {
     /// Parses an ISO 8601 date-only duration string into a [`DateDuration`].
     ///
diff --git a/components/calendar/src/error.rs b/components/calendar/src/error.rs
index ba8019b..708720c 100644
--- a/components/calendar/src/error.rs
+++ b/components/calendar/src/error.rs
@@ -570,7 +570,7 @@
     /// use icu::calendar::error::MismatchedCalendarError;
     /// use icu::calendar::Date;
     /// use icu::calendar::options::DateDifferenceOptions;
-    /// use icu::calendar::types::DateDurationUnit;
+    /// use icu::calendar::options::DateDurationUnit;
     ///
     /// let d1 = Date::try_new_gregorian(2000, 1, 1).unwrap().to_any();
     /// let d2 = Date::try_new_persian(1562, 1, 1).unwrap().to_any();
diff --git a/components/calendar/src/options.rs b/components/calendar/src/options.rs
index 55fa010..6c27671 100644
--- a/components/calendar/src/options.rs
+++ b/components/calendar/src/options.rs
@@ -6,11 +6,13 @@
 
 #[cfg(feature = "unstable")]
 pub use unstable::{
-    DateAddOptions, DateDifferenceOptions, DateFromFieldsOptions, MissingFieldsStrategy, Overflow,
+    DateAddOptions, DateDifferenceOptions, DateDurationUnit, DateFromFieldsOptions,
+    MissingFieldsStrategy, Overflow,
 };
 #[cfg(not(feature = "unstable"))]
 pub(crate) use unstable::{
-    DateAddOptions, DateDifferenceOptions, DateFromFieldsOptions, MissingFieldsStrategy, Overflow,
+    DateAddOptions, DateDifferenceOptions, DateDurationUnit, DateFromFieldsOptions,
+    MissingFieldsStrategy, Overflow,
 };
 
 mod unstable {
@@ -177,12 +179,15 @@
         /// associative or commutative in subsequent arithmetic operations, and it might require
         /// [`Overflow::Constrain`] in addition.
         ///
+        /// The resultant duration will not have any `weeks` value unless [`DateDurationUnit::Weeks`]
+        /// is explicitly specified as `largest_unit`.
+        ///
         /// # Examples
         ///
         /// ```
         /// use icu::calendar::options::DateDifferenceOptions;
         /// use icu::calendar::types::DateDuration;
-        /// use icu::calendar::types::DateDurationUnit;
+        /// use icu::calendar::options::DateDurationUnit;
         /// use icu::calendar::Date;
         ///
         /// let d1 = Date::try_new_iso(2025, 3, 31).unwrap();
@@ -206,6 +211,7 @@
         /// assert_eq!(
         ///     d1.try_until_with_options(&d2, options_weeks).unwrap(),
         ///     DateDuration {
+        ///         // This is the only time there is a `weeks` value.
         ///         weeks: 58,
         ///         days: 4,
         ///         ..Default::default()
@@ -236,10 +242,10 @@
         /// );
         /// ```
         ///
-        /// [`Months`]: crate::types::DateDurationUnit::Months
-        /// [`Years`]: crate::types::DateDurationUnit::Years
+        /// [`Months`]: crate::options::DateDurationUnit::Months
+        /// [`Years`]: crate::options::DateDurationUnit::Years
         /// [`DateDuration`]: crate::types::DateDuration
-        pub largest_unit: Option<crate::duration::DateDurationUnit>,
+        pub largest_unit: Option<DateDurationUnit>,
     }
 
     /// Whether to constrain or reject out-of-bounds values when constructing a Date.
@@ -410,6 +416,30 @@
         /// the identity of an ordinal month changes from year to year.
         Ecma,
     }
+
+    /// A "duration unit" used to specify the minimum or maximum duration of time to
+    /// care about.
+    ///
+    /// <div class="stab unstable">
+    /// 🚧 This code is considered unstable; it may change at any time, in breaking or non-breaking ways,
+    /// including in SemVer minor releases. Do not use this type unless you are prepared for things to occasionally break.
+    ///
+    /// Graduation tracking issue: [issue #3964](https://github.com/unicode-org/icu4x/issues/3964).
+    /// </div>
+    ///
+    /// ✨ *Enabled with the `unstable` Cargo feature.*
+    #[derive(Copy, Clone, Eq, PartialEq, Debug)]
+    #[allow(clippy::exhaustive_enums)] // this type should be stable
+    pub enum DateDurationUnit {
+        /// Duration in years
+        Years,
+        /// Duration in months
+        Months,
+        /// Duration in weeks
+        Weeks,
+        /// Duration in days
+        Days,
+    }
 }
 #[cfg(test)]
 mod tests {
diff --git a/components/calendar/src/tests/arithmetic.rs b/components/calendar/src/tests/arithmetic.rs
index 15c3535..de3707d 100644
--- a/components/calendar/src/tests/arithmetic.rs
+++ b/components/calendar/src/tests/arithmetic.rs
@@ -2,8 +2,8 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-use crate::options::{DateAddOptions, DateDifferenceOptions, Overflow};
-use crate::types::{DateDuration, DateDurationUnit, Month};
+use crate::options::{DateAddOptions, DateDifferenceOptions, DateDurationUnit, Overflow};
+use crate::types::{DateDuration, Month};
 use crate::{AsCalendar, Calendar, Date};
 use core::fmt;
 
diff --git a/components/calendar/src/tests/date_arithmetic_snapshot.rs b/components/calendar/src/tests/date_arithmetic_snapshot.rs
index 80d83b6..5cbbba1 100644
--- a/components/calendar/src/tests/date_arithmetic_snapshot.rs
+++ b/components/calendar/src/tests/date_arithmetic_snapshot.rs
@@ -2,8 +2,8 @@
 // called LICENSE at the top level of the ICU4X source tree
 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
 
-use crate::options::{DateAddOptions, DateDifferenceOptions};
-use crate::types::{DateDuration, DateDurationUnit, RataDie};
+use crate::options::{DateAddOptions, DateDifferenceOptions, DateDurationUnit};
+use crate::types::{DateDuration, RataDie};
 use crate::Date;
 use insta::assert_snapshot;
 use std::fmt::Write;
diff --git a/components/calendar/src/tests/extrema.rs b/components/calendar/src/tests/extrema.rs
index 87be22e..173fdd2 100644
--- a/components/calendar/src/tests/extrema.rs
+++ b/components/calendar/src/tests/extrema.rs
@@ -6,8 +6,10 @@
 use crate::duration::DateDuration;
 use crate::error::DateAddError;
 use crate::error::DateFromFieldsError;
-use crate::options::{DateAddOptions, DateDifferenceOptions, DateFromFieldsOptions, Overflow};
-use crate::types::{DateDurationUnit, DateFields, Month};
+use crate::options::{
+    DateAddOptions, DateDifferenceOptions, DateDurationUnit, DateFromFieldsOptions, Overflow,
+};
+use crate::types::{DateFields, Month};
 use crate::Date;
 use calendrical_calculations::gregorian::fixed_from_gregorian;
 use calendrical_calculations::rata_die::RataDie;
diff --git a/components/calendar/src/types.rs b/components/calendar/src/types.rs
index efe6afe..76d8267 100644
--- a/components/calendar/src/types.rs
+++ b/components/calendar/src/types.rs
@@ -12,7 +12,7 @@
 
 // Export the duration types from here
 #[cfg(feature = "unstable")]
-pub use crate::duration::{DateDuration, DateDurationUnit};
+pub use crate::duration::DateDuration;
 use crate::{calendar_arithmetic::ArithmeticDate, error::MonthCodeParseError};
 
 #[cfg(feature = "unstable")]
diff --git a/components/calendar/tests/arithmetic.rs b/components/calendar/tests/arithmetic.rs
index c786bc8..b75fcba 100644
--- a/components/calendar/tests/arithmetic.rs
+++ b/components/calendar/tests/arithmetic.rs
@@ -6,8 +6,8 @@
 
 use icu_calendar::{
     cal::Hebrew,
-    options::{DateAddOptions, DateDifferenceOptions, Overflow},
-    types::{DateDuration, DateDurationUnit, Month},
+    options::{DateAddOptions, DateDifferenceOptions, DateDurationUnit, Overflow},
+    types::{DateDuration, Month},
     AsCalendar, Calendar, Date, Iso,
 };
 
diff --git a/ffi/capi/bindings/cpp/icu4x/DateDurationUnit.d.hpp b/ffi/capi/bindings/cpp/icu4x/DateDurationUnit.d.hpp
index 86e183c..7c5b55a 100644
--- a/ffi/capi/bindings/cpp/icu4x/DateDurationUnit.d.hpp
+++ b/ffi/capi/bindings/cpp/icu4x/DateDurationUnit.d.hpp
@@ -27,7 +27,7 @@
 
 namespace icu4x {
 /**
- * See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/types/enum.DateDurationUnit.html) for more information.
+ * See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/options/enum.DateDurationUnit.html) for more information.
  */
 class DateDurationUnit {
 public:
diff --git a/ffi/capi/src/date.rs b/ffi/capi/src/date.rs
index a032624..0db2faa 100644
--- a/ffi/capi/src/date.rs
+++ b/ffi/capi/src/date.rs
@@ -34,8 +34,8 @@
         Sunday,
     }
 
-    #[diplomat::enum_convert(icu_calendar::types::DateDurationUnit, needs_wildcard)]
-    #[diplomat::rust_link(icu::calendar::types::DateDurationUnit, Enum)]
+    #[diplomat::enum_convert(icu_calendar::options::DateDurationUnit, needs_wildcard)]
+    #[diplomat::rust_link(icu::calendar::options::DateDurationUnit, Enum)]
     #[cfg(feature = "unstable")]
     #[non_exhaustive]
     pub enum DateDurationUnit {
diff --git a/ffi/dart/lib/src/bindings/DateDurationUnit.g.dart b/ffi/dart/lib/src/bindings/DateDurationUnit.g.dart
index 3c4c488..68dedbd 100644
--- a/ffi/dart/lib/src/bindings/DateDurationUnit.g.dart
+++ b/ffi/dart/lib/src/bindings/DateDurationUnit.g.dart
@@ -3,7 +3,7 @@
 
 part of 'lib.g.dart';
 
-/// See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/types/enum.DateDurationUnit.html) for more information.
+/// See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/options/enum.DateDurationUnit.html) for more information.
 enum DateDurationUnit {
   // ignore: public_member_api_docs
   years,
diff --git a/ffi/mvn/src/main/kotlin/src/main/kotlin/org/unicode/icu4x/DateDurationUnit.kt b/ffi/mvn/src/main/kotlin/src/main/kotlin/org/unicode/icu4x/DateDurationUnit.kt
index 5b994a1..eae3303 100644
--- a/ffi/mvn/src/main/kotlin/src/main/kotlin/org/unicode/icu4x/DateDurationUnit.kt
+++ b/ffi/mvn/src/main/kotlin/src/main/kotlin/org/unicode/icu4x/DateDurationUnit.kt
@@ -8,7 +8,7 @@
 
 internal interface DateDurationUnitLib: Library {
 }
-/** See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/types/enum.DateDurationUnit.html) for more information.
+/** See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/options/enum.DateDurationUnit.html) for more information.
 */
 enum class DateDurationUnit {
     Years,
diff --git a/ffi/npm/lib/DateDurationUnit.d.ts b/ffi/npm/lib/DateDurationUnit.d.ts
index 1d23fe3..430b8f7 100644
--- a/ffi/npm/lib/DateDurationUnit.d.ts
+++ b/ffi/npm/lib/DateDurationUnit.d.ts
@@ -4,7 +4,7 @@
 
 
 /**
- * See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/types/enum.DateDurationUnit.html) for more information.
+ * See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/options/enum.DateDurationUnit.html) for more information.
  */
 export class DateDurationUnit {
 
diff --git a/ffi/npm/lib/DateDurationUnit.mjs b/ffi/npm/lib/DateDurationUnit.mjs
index 789b38a..f284f09 100644
--- a/ffi/npm/lib/DateDurationUnit.mjs
+++ b/ffi/npm/lib/DateDurationUnit.mjs
@@ -5,7 +5,7 @@
 
 
 /**
- * See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/types/enum.DateDurationUnit.html) for more information.
+ * See the [Rust documentation for `DateDurationUnit`](https://docs.rs/icu/2.1.1/icu/calendar/options/enum.DateDurationUnit.html) for more information.
  */
 export class DateDurationUnit {
     #value = undefined;