| <!-- WARNING: This file is machine generated by //src/tests/fidl/source_compatibility/gen, do not edit. --> |
| |
| Note: This document covers API impact only. For more details, see the |
| [ABI compatibility page](/docs/development/languages/fidl/guides/compatibility/README.md) |
| |
| # Change an enum from flexible to strict |
| |
| ## Overview |
| |
| -|[init](#init)|[step 1](#step-1)|[step 2](#step-2)|[step 3](#step-3) |
| ---|---|---|---|--- |
| fidl|[link](#fidl-init)||[link](#fidl-2)| |
| dart|[link](#dart-init)|[link](#dart-1)|| |
| go|[link](#go-init)|[link](#go-1)|| |
| hlcpp|[link](#hlcpp-init)|[link](#hlcpp-1)|| |
| llcpp|[link](#llcpp-init)|[link](#llcpp-1)|| |
| rust|[link](#rust-init)|[link](#rust-1)||[link](#rust-3) |
| |
| ## Initial State {#init} |
| |
| ### FIDL {#fidl-init} |
| |
| ```fidl |
| type Color = flexible enum : int32 { |
| RED = 1; |
| BLUE = 2; |
| }; |
| ``` |
| |
| ### Dart {#dart-init} |
| |
| ```dart |
| fidllib.Color complement(fidllib.Color color) { |
| if (color.isUnknown()) { |
| return color; |
| } |
| switch (color) { |
| case fidllib.Color.blue: |
| return fidllib.Color.red; |
| case fidllib.Color.red: |
| return fidllib.Color.blue; |
| default: |
| return null; |
| } |
| } |
| |
| ``` |
| |
| ### Go {#go-init} |
| |
| ```go |
| func complement(color lib.Color) lib.Color { |
| if color.IsUnknown() { |
| return color |
| } |
| switch color { |
| case lib.ColorBlue: |
| return lib.ColorRed |
| case lib.ColorRed: |
| return lib.ColorBlue |
| default: |
| return color |
| } |
| } |
| |
| ``` |
| |
| ### HLCPP {#hlcpp-init} |
| |
| ```cpp |
| fidl_test::Color complement(fidl_test::Color color) { |
| if (color.IsUnknown()) { |
| return color; |
| } |
| switch (color) { |
| case fidl_test::Color::RED: |
| return fidl_test::Color::BLUE; |
| case fidl_test::Color::BLUE: |
| return fidl_test::Color::RED; |
| default: |
| return color; |
| } |
| } |
| ``` |
| |
| ### LLCPP {#llcpp-init} |
| |
| ```cpp |
| fidl_test::wire::Color complement(fidl_test::wire::Color color) { |
| if (color.IsUnknown()) { |
| return color; |
| } |
| switch (color) { |
| case fidl_test::wire::Color::kRed: |
| return fidl_test::wire::Color::kBlue; |
| case fidl_test::wire::Color::kBlue: |
| return fidl_test::wire::Color::kRed; |
| default: |
| return color; |
| } |
| } |
| ``` |
| |
| ### Rust {#rust-init} |
| |
| ```rust |
| fn complement(color: &fidl_lib::Color) -> Option<fidl_lib::Color> { |
| match color.validate() { |
| Ok(fidl_lib::Color::Red) => Some(fidl_lib::Color::Blue), |
| Ok(fidl_lib::Color::Blue) => Some(fidl_lib::Color::Red), |
| _ => None, |
| } |
| } |
| |
| ``` |
| |
| ## Update Source Code {#step-1} |
| |
| ### Dart {#dart-1} |
| |
| |
| ```diff |
| fidllib.Color complement(fidllib.Color color) { |
| - if (color.isUnknown()) { |
| - return color; |
| - } |
| + assert(color.isUnknown() == false); |
| switch (color) { |
| case fidllib.Color.blue: |
| return fidllib.Color.red; |
| case fidllib.Color.red: |
| return fidllib.Color.blue; |
| default: |
| return null; |
| } |
| } |
| |
| |
| ``` |
| |
| ### Go {#go-1} |
| |
| - Remove usages of any flexible specific APIs |
| |
| ```diff |
| func complement(color lib.Color) lib.Color { |
| - if color.IsUnknown() { |
| - return color |
| - } |
| switch color { |
| case lib.ColorBlue: |
| return lib.ColorRed |
| case lib.ColorRed: |
| return lib.ColorBlue |
| default: |
| return color |
| } |
| } |
| |
| |
| ``` |
| |
| ### HLCPP {#hlcpp-1} |
| |
| - Remove usages of any flexible specific APIs |
| |
| ```diff |
| fidl_test::Color complement(fidl_test::Color color) { |
| - if (color.IsUnknown()) { |
| - return color; |
| - } |
| switch (color) { |
| case fidl_test::Color::RED: |
| return fidl_test::Color::BLUE; |
| case fidl_test::Color::BLUE: |
| return fidl_test::Color::RED; |
| default: |
| return color; |
| } |
| } |
| |
| ``` |
| |
| ### LLCPP {#llcpp-1} |
| |
| - Remove usages of any flexible specific APIs |
| |
| ```diff |
| fidl_test::wire::Color complement(fidl_test::wire::Color color) { |
| - if (color.IsUnknown()) { |
| - return color; |
| - } |
| switch (color) { |
| case fidl_test::wire::Color::kRed: |
| return fidl_test::wire::Color::kBlue; |
| case fidl_test::wire::Color::kBlue: |
| return fidl_test::wire::Color::kRed; |
| default: |
| return color; |
| } |
| } |
| |
| ``` |
| |
| ### Rust {#rust-1} |
| |
| - Remove usages of any flexible specific APIs |
| - Allow unreachable patterns and add an underscore arm to any `match` statements on the enum. |
| |
| ```diff |
| fn complement(color: &fidl_lib::Color) -> Option<fidl_lib::Color> { |
| - match color.validate() { |
| - Ok(fidl_lib::Color::Red) => Some(fidl_lib::Color::Blue), |
| - Ok(fidl_lib::Color::Blue) => Some(fidl_lib::Color::Red), |
| + #[allow(unreachable_patterns)] |
| + match color { |
| + fidl_lib::Color::Red => Some(fidl_lib::Color::Blue), |
| + fidl_lib::Color::Blue => Some(fidl_lib::Color::Red), |
| _ => None, |
| } |
| } |
| |
| |
| ``` |
| |
| ## Update FIDL Library {#step-2} |
| |
| - Change from `flexible` to `strict` |
| |
| ```diff |
| - type Color = flexible enum : int32 { |
| + type Color = strict enum : int32 { |
| RED = 1; |
| BLUE = 2; |
| }; |
| |
| ``` |
| |
| ## Update Source Code {#step-3} |
| |
| ### Rust {#rust-3} |
| |
| - Remove the unreachable patterns attribute and underscore arm. |
| |
| ```diff |
| - fn complement(color: &fidl_lib::Color) -> Option<fidl_lib::Color> { |
| - #[allow(unreachable_patterns)] |
| + fn complement(color: &fidl_lib::Color) -> fidl_lib::Color { |
| match color { |
| - fidl_lib::Color::Red => Some(fidl_lib::Color::Blue), |
| - fidl_lib::Color::Blue => Some(fidl_lib::Color::Red), |
| - _ => None, |
| + fidl_lib::Color::Red => fidl_lib::Color::Blue, |
| + fidl_lib::Color::Blue => fidl_lib::Color::Red, |
| } |
| } |
| |
| |
| ``` |
| |