Graduating Components from Experimental
=======================================

This document contains a checklist for the requirements to migrate a component from experimental.

- [ ] The crate should fully conform with the [ICU4X Style Guide](https://github.com/unicode-org/icu4x/blob/main/documents/process/style_guide.md):
  - [ ] The crate should have a complete library header as shown in [boilerplate.md](https://github.com/unicode-org/icu4x/blob/main/documents/process/boilerplate.md) with Clippy passing
  - [ ] The names of exported types should conform to the recommendations in the Style Guide
  - [ ] All Error types should be `Copy`
  - [ ] All constructors should take options structs by value
  - [ ] All constructors should take arguments in the following order: Provider, Locale, Options
  - [ ] All constructors should have the standard set of overloads for provider types
  - [ ] Runtime dependencies should be minimal and able to be disabled with Cargo features if possible
  - [ ] Any `TODO`, `FIXME`, `todo!`, `unimplemented!`, or other placeholders should either be resolved or link to an issue number. (It is okay to ship a small amount of code with tech debt comments, but anything having to do with code correctness should be resolved)
- [ ] The crate should have a conventional Cargo.toml file:
  - [ ] Cargo.toml should use license, not license-file
  - [ ] The description should be useful
  - [ ] Correct repo link, authors, categories, include
  - [ ] Correct docs.rs and cargo-all-features metadata settings
  - [ ] A `rust-version` field with the MSRV of this crate in accordance with the current ICU4X policies on MSRV.
  - [ ] The crate should have an `std` feature if (and only if) it contains code that depends on `std`, such as file I/O or implementing the Error trait
  - [ ] Audit all features so that any `foo/bar` in a feature is `foo?/bar` when `foo` is an optional dep; if you intend to enable `foo`, add two entries
  - [ ] Use `dep:` for enabling dependencies
- [ ] The crate should be fully documented
  - [ ] Every exported function should have docs coverage
  - [ ] There should be a crate-level example that illustrates a common use case for the component with the heading `# Examples`
  - [ ] All options and conditional code paths should have a corresponding docs test with the heading `# Examples`
  - [ ] All functions that are conditional on a Cargo feature should say so (last line before `# Examples`): ```✨ *Enabled with the `alloc` Cargo feature.*```
  - [ ] Compiled data constructors should say "with compiled data" in the first sentence and should have a Cargo feature alert following the above syntax.
- [ ] The APIs should follow ICU4X style
  - [ ] All options bags should be `Copy` (and contain references if they need to). Exceptions can be made by discussion.
  - [ ] All options bags and their relevant options must be in an `options` module ([#5991](https://github.com/unicode-org/icu4x/issues/5991))
  - [ ] If there is a Borrowed type, then compiled data constructors like `Foo::new()` must return `FooBorrowed` ([#5440](https://github.com/unicode-org/icu4x/issues/5440))
  - [ ] Options bag enum fields should consistently be wrapped in an `Option`, ideally with a better-named default/"auto" variant ([#5488](https://github.com/unicode-org/icu4x/issues/5488))
- [ ] The data structs should fully follow ZeroVec style
  - [ ] Deserialization should not have a "zero-copy violation" in the [make-testdata](https://github.com/unicode-org/icu4x/blob/main/provider/source/src/tests/make_testdata.rs) test
  - [ ] Constructors should avoid allocating memory in the common case
  - [ ] Opaque blobs of data should be avoided if possible (instead use VarZeroVec, ZeroMap, etc.)
  - [ ] Data structs should not be panicky to load/deserialize and conform to [data_safety.md](https://github.com/unicode-org/icu4x/blob/main/documents/design/data_safety.md)
  - [ ] If any data structs use a large or unbounded number of data marker attributes, they are implemented in a way that reduces stack space, file size, and construction time, such as by having only a single variable-length field
- [ ] The component should be fully integrated with ICU4X tooling
  - [ ] There should be an overview Criterion benchmark
  - [ ] There should be individual Criterion benchmarks for interesting or performance critical code paths
  - [ ] There should be at least one example plumbed with the icu_benchmark_macros
  - [ ] The component should be fully covered by FFI with no unjustified suppressions nor entries in missing_apis.txt
- [ ] The component should encourage i18n best practices
  - [ ] The component should produce correct results in all locales as generated by icu4x-datagen
  - [ ] Where applicable, the component should be consistent with ECMA-402 and UTS#35
  - [ ] Any gaps in i18n quality should be fixed, or, if that is not possible, they should have tracking issues and a concrete, resourced path forward. The intent is to not ship components with known i18n correctness problems and no plan to fix them in an upcoming release
  - [ ] The API design should receive sign-off from a non-ICU4X i18n expert such as Markus Scherer
- [ ] Make sure the graduation PR has a comprehensive changelog entry (see [changelog.md](changelog.md))
