# `DalaDev.Device`
[🔗](https://github.com/manhvu/dala_dev/blob/main/lib/mob_dev/device.ex#L1)

Represents a connected or available device (physical or emulator/simulator).

This struct is the central data structure used throughout dala_dev for device
identification, connection, and deployment operations.

# `device_type`

```elixir
@type device_type() :: :emulator | :simulator | :physical
```

# `platform`

```elixir
@type platform() :: :android | :ios
```

# `status`

```elixir
@type status() :: :discovered | :unauthorized | :tunneled | :connected | :error
```

# `t`

```elixir
@type t() :: %DalaDev.Device{
  dist_port: pos_integer() | nil,
  error: String.t() | nil,
  host_ip: String.t() | nil,
  name: String.t() | nil,
  node: atom() | nil,
  platform: platform(),
  serial: String.t(),
  status: status(),
  type: device_type() | nil,
  version: String.t() | nil
}
```

# `display_id`

```elixir
@spec display_id(t()) :: String.t()
```

Returns the short ID shown in `mix dala.devices` and accepted by `--device`.

- Android: the serial as-is (`emulator-5554`, `R5CW3089HVB`)
- iOS simulator: first 8 hex chars of the UDID, lowercased (`78354490`) —
  same prefix used in the node name
- iOS physical: full UDID

# `match_id?`

```elixir
@spec match_id?(t(), String.t()) :: boolean()
```

Returns true if `input` identifies this device.

Matches against either `display_id/1` or the full serial, both case-insensitively.
This is used by `mix dala.deploy --device <id>` to target a specific device
by its short ID or full serial number.

## Examples

    iex> device = %DalaDev.Device{platform: :android, serial: "R5CW3089HVB"}
    iex> DalaDev.Device.match_id?(device, "HVBA")
    true

    iex> DalaDev.Device.match_id?(device, "R5CW3089HVB")
    true

# `node_name`

```elixir
@spec node_name(t()) :: atom()
```

Returns the Erlang node name atom for a device.

The node name format varies by platform:

- **Android** (emulator/physical): `<app>_android_<serial-stub>@127.0.0.1`
  Unique per device since Mac's EPMD is shared via adb-reverse, requiring
  a suffix to avoid collisions when multiple phones run the same app.

- **iOS simulator**: `<app>_ios_<8-char-udid>@127.0.0.1`
  Unique per simulator, matches the name dala_beam.m builds using SIMULATOR_UDID.

- **iOS physical**: `<app>_ios@<device-ip>`
  dala_beam.m finds the device IP using priority: USB > WiFi/LAN > Tailscale.

# `short_id`

```elixir
@spec short_id(String.t()) :: String.t()
```

Derives a short identifier from a serial for use in node names.

Returns the last 4 alphanumeric characters of the serial (with dashes removed),
uppercased. This provides a short, somewhat human-readable identifier.

## Examples

    iex> DalaDev.Device.short_id("emulator-5554")
    "5554"

    iex> DalaDev.Device.short_id("R5CW3089HVB")
    "HVBA"

    iex> DalaDev.Device.short_id("78354490-EF38-44D7-A437-DD941C20524D")
    "524D"

# `summary`

```elixir
@spec summary(t()) :: String.t()
```

Human-readable one-line summary.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
