# `VehicleRegistration`

A vehicle's registration mark with its country: `GB AB12 CDE`.

Use it for parking, fleets and insurance. For the number that stays with a vehicle for life, use [`Vin`](/docs/types/type-vin.md).

## Shape

| Field | Type | Required? |
|---|---|---|
| `country` | [`Country`](/docs/types/type-country.md) | Yes |
| `plate` | `Text` | Yes |

## Example

```jadpo
VehicleRegistration { country: Country.gb plate: "AB12 CDE" }
```

`text.parse(raw, as: VehicleRegistration)` reads one from text that comes from outside. Text that isn't one at all fails `malformed`, such as `GB ab12 cde`, `GB AB12  CDE` or `GB AB12-`.

## Good to know

- The mark is kept as its plate shows it: in capitals, with single spaces.
- `==` tells you whether two are the same. `<` and `list.sort_by` don't take it, so sort by one of its parts instead.

## In JSON

A string, in a request, a response or `json.write`:

```json
"GB AB12 CDE"
"DE M-AB 1234"
"FR AA-123-AA"
```

## Details

<details>
<summary>Text form, storage, how it is shown, and operations</summary>

`VehicleRegistration` is in the group Commerce and logistics, and has been in Jadpo since 0.1.0.

### Text form

`text.from` writes one standard text form, the same form `text.parse` reads back: `GB AB12 CDE`, `DE M-AB 1234` and `FR AA-123-AA`.

### How it is stored

It is stored in 2 columns, each named for the field, `_` and its suffix. This is `DE M-AB 1234`:

| Column | Type | Holds |
|---|---|---|
| `<field>_country` | `text` | `'DE'` |
| `<field>_plate` | `text` | `'M-AB 1234'` |

### How it is shown to people

`text.format(value, locale:)` shows it to people in their locale.

With `locale: Locale.en_gb`:

| Value | Shown |
|---|---|
| `GB AB12 CDE` | `GB AB12 CDE` |
| `DE M-AB 1234` | `DE M-AB 1234` |
| `FR AA-123-AA` | `FR AA-123-AA` |

### Operations

It also takes `text.parse`, `text.from`, `text.format`, `json.read`, `json.write` and `==`. [How every standard type behaves](/docs/every-standard-type-meets-one-contract.md) says how they work.

</details>
