Enums in Dart

Our example demonstrates how to implement enumerated types (enums) with the target language and its existing idioms. Here’s the full source code and explanation.

// Define the ServerState enum
enum ServerState {
  idle,
  connected,
  error,
  retrying
}

// Create a mapping for the state names
const stateName = {
  ServerState.idle: "idle",
  ServerState.connected: "connected",
  ServerState.error: "error",
  ServerState.retrying: "retrying"
};

// Implement the transition function to emulate state transitions
ServerState transition(ServerState s) {
  switch (s) {
    case ServerState.idle:
      return ServerState.connected;
    case ServerState.connected:
    case ServerState.retrying:
      return ServerState.idle;
    case ServerState.error:
      return ServerState.error;
    default:
      throw Exception("unknown state: ${s}");
  }
}

void main() {
  var ns = transition(ServerState.idle);
  print(stateName[ns]); // prints "connected"

  var ns2 = transition(ns);
  print(stateName[ns2]); // prints "idle"
}

Our enum type ServerState has four possible values: idle, connected, error, and retrying.

enum ServerState {
  idle,
  connected,
  error,
  retrying
}

The possible values for ServerState are defined using enum, which provides a way to define a collection of named constants.

By implementing a mapping using a constant Map, values of ServerState can be printed out or converted to strings.

const stateName = {
  ServerState.idle: "idle",
  ServerState.connected: "connected",
  ServerState.error: "error",
  ServerState.retrying: "retrying"
};

The transition function emulates a state transition for a server; it takes the existing state and returns a new state.

ServerState transition(ServerState s) {
  switch (s) {
    case ServerState.idle:
      return ServerState.connected;
    case ServerState.connected:
    case ServerState.retrying:
      return ServerState.idle;
    case ServerState.error:
      return ServerState.error;
    default:
      throw Exception("unknown state: ${s}");
  }
}

In main, we have an example of how to use the transition function and print the state names.

void main() {
  var ns = transition(ServerState.idle);
  print(stateName[ns]); // prints "connected"

  var ns2 = transition(ns);
  print(stateName[ns2]); // prints "idle"
}

In this example, the transition function takes a ServerState value and returns the next state. This provides some degree of compile-time type safety for enums, ensuring that only valid states are used.