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

Remove union member

Overview

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

Initial State {#init}

FIDL {#fidl-init}

  1. flexible union JsonValue {
  2. 1: int32 int_value;
  3. 2: string:MAX string_value;
  4. 3: float32 float_value;
  5. };

Dart {#dart-init}

  1. fidllib.JsonValue writer(String s) {
  2. final asFloat = double.tryParse(s);
  3. if (asFloat != null) {
  4. return fidllib.JsonValue.withFloatValue(asFloat);
  5. }
  6. final asInt = int.tryParse(s);
  7. if (asInt != null) {
  8. return fidllib.JsonValue.withIntValue(asInt);
  9. }
  10. return fidllib.JsonValue.withStringValue(s);
  11. }
  12. String reader(fidllib.JsonValue value) {
  13. switch (value.$tag) {
  14. case fidllib.JsonValueTag.intValue:
  15. return '${value.intValue}';
  16. case fidllib.JsonValueTag.stringValue:
  17. return value.stringValue;
  18. case fidllib.JsonValueTag.floatValue:
  19. return '${value.floatValue}';
  20. default:
  21. return '<${value.$unknownData.data.length} unknown bytes>';
  22. }
  23. }

Go {#go-init}

  1. func writer(s string) lib.JsonValue {
  2. n, err := strconv.ParseInt(s, 10, 32)
  3. if err == nil {
  4. return lib.JsonValueWithIntValue(int32(n))
  5. }
  6. var f float64
  7. f, err = strconv.ParseFloat(s, 64)
  8. if err == nil {
  9. return lib.JsonValueWithFloatValue(float32(f))
  10. }
  11. return lib.JsonValueWithStringValue(s)
  12. }
  13. func reader(value lib.JsonValue) string {
  14. switch value.Which() {
  15. case lib.JsonValueIntValue:
  16. return fmt.Sprintf("%d", value.IntValue)
  17. case lib.JsonValueStringValue:
  18. return value.StringValue
  19. case lib.JsonValueFloatValue:
  20. return fmt.Sprintf("%f", value.FloatValue)
  21. default:
  22. return fmt.Sprintf("<%d unknown bytes>", len(value.GetUnknownData().Bytes))
  23. }
  24. }

HLCPP {#hlcpp-init}

  1. fidl_test::JsonValue writer(const std::string& s) {
  2. std::optional<float> maybe_float = parse_as_float(s);
  3. if (maybe_float) {
  4. return fidl_test::JsonValue::WithFloatValue(std::move(*maybe_float));
  5. }
  6. std::optional<int32_t> maybe_int = parse_as_int(s);
  7. if (maybe_int) {
  8. return fidl_test::JsonValue::WithIntValue(std::move(*maybe_int));
  9. }
  10. auto val = s;
  11. return fidl_test::JsonValue::WithStringValue(std::move(val));
  12. }
  13. std::string reader(const fidl_test::JsonValue& value) {
  14. switch (value.Which()) {
  15. case fidl_test::JsonValue::Tag::kIntValue:
  16. return std::to_string(value.int_value());
  17. case fidl_test::JsonValue::Tag::kStringValue:
  18. return value.string_value();
  19. case fidl_test::JsonValue::Tag::kFloatValue:
  20. return std::to_string(value.float_value());
  21. case fidl_test::JsonValue::Tag::Invalid:
  22. return "<uninitialized>";
  23. case fidl_test::JsonValue::Tag::kUnknown: {
  24. std::ostringstream out;
  25. out << "<" << value.UnknownBytes()->size() << " unknown bytes>";
  26. return out.str();
  27. }
  28. }
  29. }

LLCPP {#llcpp-init}

  1. fidl_test::JsonValue writer(const std::string& s) {
  2. std::optional<float> maybe_float = parse_as_float(s);
  3. ;
  4. if (maybe_float) {
  5. return fidl_test::JsonValue::WithIntValue(std::make_unique<int32_t>(*maybe_float));
  6. }
  7. std::optional<int32_t> maybe_int = parse_as_int(s);
  8. if (maybe_int) {
  9. return fidl_test::JsonValue::WithIntValue(std::make_unique<int32_t>(*maybe_int));
  10. }
  11. return fidl_test::JsonValue::WithStringValue(
  12. std::make_unique<fidl::StringView>(fidl::heap_copy_str(s)));
  13. }
  14. std::string reader(const fidl_test::JsonValue& value) {
  15. switch (value.which()) {
  16. case fidl_test::JsonValue::Tag::kIntValue:
  17. return std::to_string(value.int_value());
  18. case fidl_test::JsonValue::Tag::kStringValue:
  19. return std::string(value.string_value().data(), value.string_value().size());
  20. case fidl_test::JsonValue::Tag::kFloatValue:
  21. return std::to_string(value.float_value());
  22. case fidl_test::JsonValue::Tag::kUnknown:
  23. return "<unknown>";
  24. }
  25. }

Rust {#rust-init}

  1. fn writer(s: &str) -> fidl_lib::JsonValue {
  2. let as_float = s.parse::<f32>();
  3. if let Ok(val) = as_float {
  4. return fidl_lib::JsonValue::FloatValue(val);
  5. }
  6. let as_int = s.parse::<i32>();
  7. as_int
  8. .map(|n| fidl_lib::JsonValue::IntValue(n))
  9. .unwrap_or(fidl_lib::JsonValue::StringValue(s.to_string()))
  10. }
  11. fn reader(value: fidl_lib::JsonValue) -> String {
  12. match value {
  13. fidl_lib::JsonValue::IntValue(n) => format!("{}", n),
  14. fidl_lib::JsonValue::StringValue(s) => s,
  15. fidl_lib::JsonValue::FloatValue(v) => format!("{:.2}", v),
  16. fidl_lib::JsonValueUnknown!() => "<unknown>".to_string(),
  17. }
  18. }

Update Source Code {#step-1}

Dart {#dart-1}

  • Update writers to stop producing new instances of the soon-to-be-removed variant.
  • Remove references to the soon-to-be-removed variant from any switch statements on the union tag. These must be temporarily handled as part of a default case.
  1. fidllib.JsonValue writer(String s) {
  2. - final asFloat = double.tryParse(s);
  3. - if (asFloat != null) {
  4. - return fidllib.JsonValue.withFloatValue(asFloat);
  5. - }
  6. final asInt = int.tryParse(s);
  7. if (asInt != null) {
  8. return fidllib.JsonValue.withIntValue(asInt);
  9. }
  10. return fidllib.JsonValue.withStringValue(s);
  11. }
  12. String reader(fidllib.JsonValue value) {
  13. switch (value.$tag) {
  14. case fidllib.JsonValueTag.intValue:
  15. return '${value.intValue}';
  16. case fidllib.JsonValueTag.stringValue:
  17. return value.stringValue;
  18. - case fidllib.JsonValueTag.floatValue:
  19. - return '${value.floatValue}';
  20. + case fidllib.JsonValueTag.$unknown:
  21. + return '<${value.$unknownData.data.length} unknown bytes>';
  22. default:
  23. - return '<${value.$unknownData.data.length} unknown bytes>';
  24. + return '<unknown new member>';
  25. }
  26. }

Go {#go-1}

  • Update writers to stop producing new instances of the soon-to-be-removed variant.
  • Remove references to the soon-to-be-removed variant from any switch statements on the union tag. These must be temporarily handled as part of a default case.
  1. func writer(s string) lib.JsonValue {
  2. n, err := strconv.ParseInt(s, 10, 32)
  3. if err == nil {
  4. return lib.JsonValueWithIntValue(int32(n))
  5. - }
  6. - var f float64
  7. - f, err = strconv.ParseFloat(s, 64)
  8. - if err == nil {
  9. - return lib.JsonValueWithFloatValue(float32(f))
  10. }
  11. return lib.JsonValueWithStringValue(s)
  12. }
  13. func reader(value lib.JsonValue) string {
  14. switch value.Which() {
  15. case lib.JsonValueIntValue:
  16. return fmt.Sprintf("%d", value.IntValue)
  17. case lib.JsonValueStringValue:
  18. return value.StringValue
  19. - case lib.JsonValueFloatValue:
  20. - return fmt.Sprintf("%f", value.FloatValue)
  21. + case lib.JsonValue_unknownData:
  22. + return fmt.Sprintf("<%d unknown bytes>", len(value.GetUnknownData().Bytes))
  23. default:
  24. - return fmt.Sprintf("<%d unknown bytes>", len(value.GetUnknownData().Bytes))
  25. + return "<unknown new member>"
  26. }
  27. }

HLCPP {#hlcpp-1}

  • Update writers to stop producing new instances of the soon-to-be-removed variant.
  • Remove references to the soon-to-be-removed variant from any switch statements on the union tag. These must be temporarily handled as part of a default case.
  1. fidl_test::JsonValue writer(const std::string& s) {
  2. - std::optional<float> maybe_float = parse_as_float(s);
  3. - if (maybe_float) {
  4. - return fidl_test::JsonValue::WithFloatValue(std::move(*maybe_float));
  5. - }
  6. -
  7. std::optional<int32_t> maybe_int = parse_as_int(s);
  8. if (maybe_int) {
  9. return fidl_test::JsonValue::WithIntValue(std::move(*maybe_int));
  10. }
  11. auto val = s;
  12. return fidl_test::JsonValue::WithStringValue(std::move(val));
  13. }
  14. std::string reader(const fidl_test::JsonValue& value) {
  15. switch (value.Which()) {
  16. case fidl_test::JsonValue::Tag::kIntValue:
  17. return std::to_string(value.int_value());
  18. case fidl_test::JsonValue::Tag::kStringValue:
  19. return value.string_value();
  20. - case fidl_test::JsonValue::Tag::kFloatValue:
  21. - return std::to_string(value.float_value());
  22. case fidl_test::JsonValue::Tag::Invalid:
  23. return "<uninitialized>";
  24. case fidl_test::JsonValue::Tag::kUnknown: {
  25. std::ostringstream out;
  26. out << "<" << value.UnknownBytes()->size() << " unknown bytes>";
  27. return out.str();
  28. }
  29. + default:
  30. + return "<unknown new member>";
  31. }
  32. }

LLCPP {#llcpp-1}

  • Update writers to stop producing new instances of the soon-to-be-removed variant.
  • Remove references to the soon-to-be-removed variant from any switch statements on the union tag. These must be temporarily handled as part of a default case.
  1. fidl_test::JsonValue writer(const std::string& s) {
  2. - std::optional<float> maybe_float = parse_as_float(s);
  3. - ;
  4. - if (maybe_float) {
  5. - return fidl_test::JsonValue::WithIntValue(std::make_unique<int32_t>(*maybe_float));
  6. - }
  7. std::optional<int32_t> maybe_int = parse_as_int(s);
  8. if (maybe_int) {
  9. return fidl_test::JsonValue::WithIntValue(std::make_unique<int32_t>(*maybe_int));
  10. }
  11. return fidl_test::JsonValue::WithStringValue(
  12. std::make_unique<fidl::StringView>(fidl::heap_copy_str(s)));
  13. }
  14. std::string reader(const fidl_test::JsonValue& value) {
  15. switch (value.which()) {
  16. case fidl_test::JsonValue::Tag::kIntValue:
  17. return std::to_string(value.int_value());
  18. case fidl_test::JsonValue::Tag::kStringValue:
  19. return std::string(value.string_value().data(), value.string_value().size());
  20. - case fidl_test::JsonValue::Tag::kFloatValue:
  21. - return std::to_string(value.float_value());
  22. case fidl_test::JsonValue::Tag::kUnknown:
  23. + default:
  24. return "<unknown>";
  25. }
  26. }

Rust {#rust-1}

  • Update writers to stop producing new instances of the soon-to-be-removed variant.
  • Remove references to the soon-to-be-removed variant from any match statements on the union. These must be temporarily handled as part of a default catch-all case.
  1. fn writer(s: &str) -> fidl_lib::JsonValue {
  2. - let as_float = s.parse::<f32>();
  3. - if let Ok(val) = as_float {
  4. - return fidl_lib::JsonValue::FloatValue(val);
  5. - }
  6. let as_int = s.parse::<i32>();
  7. as_int
  8. .map(|n| fidl_lib::JsonValue::IntValue(n))
  9. .unwrap_or(fidl_lib::JsonValue::StringValue(s.to_string()))
  10. }
  11. fn reader(value: fidl_lib::JsonValue) -> String {
  12. match value {
  13. fidl_lib::JsonValue::IntValue(n) => format!("{}", n),
  14. fidl_lib::JsonValue::StringValue(s) => s,
  15. - fidl_lib::JsonValue::FloatValue(v) => format!("{:.2}", v),
  16. - fidl_lib::JsonValueUnknown!() => "<unknown>".to_string(),
  17. + _ => "<unknown>".to_string(),
  18. }
  19. }

Update FIDL Library {#step-2}

  • Remove the union variant
  1. flexible union JsonValue {
  2. 1: int32 int_value;
  3. 2: string:MAX string_value;
  4. - 3: float32 float_value;
  5. };

Update Source Code {#step-3}

Dart {#dart-3}

  • The default case can now be removed from any switch statements on the union tag.
  1. if (asInt != null) {
  2. return fidllib.JsonValue.withIntValue(asInt);
  3. }
  4. return fidllib.JsonValue.withStringValue(s);
  5. }
  6. String reader(fidllib.JsonValue value) {
  7. switch (value.$tag) {
  8. case fidllib.JsonValueTag.intValue:
  9. return '${value.intValue}';
  10. case fidllib.JsonValueTag.stringValue:
  11. return value.stringValue;
  12. - case fidllib.JsonValueTag.$unknown:
  13. + default:
  14. return '<${value.$unknownData.data.length} unknown bytes>';
  15. - default:
  16. - return '<unknown new member>';
  17. }
  18. }

Go {#go-3}

  • The default case can now be removed from any switch statements on the union tag.
  1. if err == nil {
  2. return lib.JsonValueWithIntValue(int32(n))
  3. }
  4. return lib.JsonValueWithStringValue(s)
  5. }
  6. func reader(value lib.JsonValue) string {
  7. switch value.Which() {
  8. case lib.JsonValueIntValue:
  9. return fmt.Sprintf("%d", value.IntValue)
  10. case lib.JsonValueStringValue:
  11. return value.StringValue
  12. - case lib.JsonValue_unknownData:
  13. + default:
  14. return fmt.Sprintf("<%d unknown bytes>", len(value.GetUnknownData().Bytes))
  15. - default:
  16. - return "<unknown new member>"
  17. }
  18. }

HLCPP {#hlcpp-3}

  • The default case can now be removed from any switch statements on the union tag.
  1. switch (value.Which()) {
  2. case fidl_test::JsonValue::Tag::kIntValue:
  3. return std::to_string(value.int_value());
  4. case fidl_test::JsonValue::Tag::kStringValue:
  5. return value.string_value();
  6. case fidl_test::JsonValue::Tag::Invalid:
  7. return "<uninitialized>";
  8. case fidl_test::JsonValue::Tag::kUnknown: {
  9. std::ostringstream out;
  10. out << "<" << value.UnknownBytes()->size() << " unknown bytes>";
  11. return out.str();
  12. }
  13. - default:
  14. - return "<unknown new member>";
  15. }
  16. }

LLCPP {#llcpp-3}

  • The default case can now be removed from any switch statements on the union tag.
  1. }
  2. return fidl_test::JsonValue::WithStringValue(
  3. std::make_unique<fidl::StringView>(fidl::heap_copy_str(s)));
  4. }
  5. std::string reader(const fidl_test::JsonValue& value) {
  6. switch (value.which()) {
  7. case fidl_test::JsonValue::Tag::kIntValue:
  8. return std::to_string(value.int_value());
  9. case fidl_test::JsonValue::Tag::kStringValue:
  10. return std::string(value.string_value().data(), value.string_value().size());
  11. case fidl_test::JsonValue::Tag::kUnknown:
  12. - default:
  13. return "<unknown>";
  14. }
  15. }

Rust {#rust-3}

  • The catch-all case can now be removed from any match statements on the union.
  1. fn writer(s: &str) -> fidl_lib::JsonValue {
  2. let as_int = s.parse::<i32>();
  3. as_int
  4. .map(|n| fidl_lib::JsonValue::IntValue(n))
  5. .unwrap_or(fidl_lib::JsonValue::StringValue(s.to_string()))
  6. }
  7. fn reader(value: fidl_lib::JsonValue) -> String {
  8. match value {
  9. fidl_lib::JsonValue::IntValue(n) => format!("{}", n),
  10. fidl_lib::JsonValue::StringValue(s) => s,
  11. - _ => "<unknown>".to_string(),
  12. + fidl_lib::JsonValueUnknown!() => "<unknown>".to_string(),
  13. }
  14. }