Skip to content

Latest commit

 

History

History
260 lines (205 loc) · 5.26 KB

File metadata and controls

260 lines (205 loc) · 5.26 KB

Note: This document covers API impact only. For more details, see the ABI compatibility page

Change an enum from flexible to strict

Overview

- init step 1 step 2 step 3
fidl link link
dart link link
go link link
hlcpp link link
llcpp link link
rust link link link

Initial State {#init}

FIDL {#fidl-init}

type Color = flexible enum : int32 {
    RED = 1;
    BLUE = 2;
};

Dart {#dart-init}

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}

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}

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}

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}

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}

  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
  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
  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
  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.
  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
- 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.
- 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,
      }
  }