Example

Money and Dates

Payments with money and dates.

← All examples

Specification

$imports: [ 'types/date', 'types/money' ]

$flags: 'FLEXIBLE_WHITESPACE'

Payment:
  $fields:
    money: Money
    date: Date
  $patterns: '#{money} due on #{date}'

Imported types

types/number.yml
Number:
  Integer: '\d+'
  Decimal: '${Integer}\.${Integer}+'
types/currency.yml
Currency:
  EUR: 'EUR'
  USD: 'USD'
  GBP: 'GBP'
types/money.yml
$imports: [ 'number', 'currency' ]

$flags: 'FLEXIBLE_WHITESPACE'

Money:
  $fields:
    currency: Currency
    amount: Number
  $patterns: '#{currency} #{amount}'
types/date.yml
$imports: 'number'

Month:
  JAN: 'January'
  FEB: 'February'
  MAR: 'March'
  APR: 'April'
  MAY: 'May'
  JUN: 'June'
  JUL: 'July'
  AUG: 'August'
  SEP: 'September'
  OCT: 'October'
  NOV: 'November'
  DEC: 'December'

Date:

  ISO:
    $fields:
      year: { $type: Integer, $patterns: '\d{4}' }
      month: { $type: Integer, $patterns: '0[1-9]|1[0-2]' }
      day: { $type: Integer, $patterns: '0[1-9]|[12]\d|3[01]' }
    $patterns:
      - '#{year}-#{month}-#{day}'
      - '#{month}/#{day}/#{year}'
      - '#{day}-#{month}-#{year}'

  Textual:
    $fields:
      year: { $type: Integer, $patterns: '\d{4}' }
      month: Month
      day: { $type: Integer, $patterns: '0[1-9]|[12]\d|3[01]' }
    $patterns: 
      - '#{month} #{day}, #{year}'

Sample input

EUR 50.5 due on May 31, 2025
USD 20 due on 2026-01-15

Result

[
  {
    "type": "Payment",
    "text": "EUR 50.5 due on May 31, 2025",
    "start": 0,
    "end": 28,
    "fields": [
      {
        "type": "Money",
        "field": "money",
        "text": "EUR 50.5",
        "start": 0,
        "end": 8,
        "fields": [
          {
            "type": "Currency::EUR",
            "field": "currency",
            "text": "EUR",
            "start": 0,
            "end": 3
          },
          {
            "type": "Number::Decimal",
            "field": "amount",
            "text": "50.5",
            "start": 4,
            "end": 8
          }
        ]
      },
      {
        "type": "Date::Textual",
        "field": "date",
        "text": "May 31, 2025",
        "start": 16,
        "end": 28,
        "fields": [
          {
            "type": "Month::MAY",
            "field": "month",
            "text": "May",
            "start": 16,
            "end": 19
          },
          {
            "type": "Number::Integer",
            "field": "day",
            "text": "31",
            "start": 20,
            "end": 22
          },
          {
            "type": "Number::Integer",
            "field": "year",
            "text": "2025",
            "start": 24,
            "end": 28
          }
        ]
      }
    ]
  },
  {
    "type": "Payment",
    "text": "USD 20 due on 2026-01-15",
    "start": 29,
    "end": 53,
    "fields": [
      {
        "type": "Money",
        "field": "money",
        "text": "USD 20",
        "start": 29,
        "end": 35,
        "fields": [
          {
            "type": "Currency::USD",
            "field": "currency",
            "text": "USD",
            "start": 29,
            "end": 32
          },
          {
            "type": "Number::Integer",
            "field": "amount",
            "text": "20",
            "start": 33,
            "end": 35
          }
        ]
      },
      {
        "type": "Date::ISO",
        "field": "date",
        "text": "2026-01-15",
        "start": 43,
        "end": 53,
        "fields": [
          {
            "type": "Number::Integer",
            "field": "year",
            "text": "2026",
            "start": 43,
            "end": 47
          },
          {
            "type": "Number::Integer",
            "field": "month",
            "text": "01",
            "start": 48,
            "end": 50
          },
          {
            "type": "Number::Integer",
            "field": "day",
            "text": "15",
            "start": 51,
            "end": 53
          }
        ]
      }
    ]
  }
]

Notes

# Money and Dates

Small multi-file spec for payments such as `EUR 50.5 due on May 31, 2025`.

## Notice

- `spec.yml` imports reusable files from `types/`.
- `Number`, `Currency`, and `Date` use semantic subtypes and fields.
- `Date` exposes `year`, `month`, and `day`.
- `Payment` composes `Money` and `Date`.

```yaml
$imports:
  - types/money
  - types/date

Payment: '#{money:Money} due on #{date:Date}'
```

Try changing ISO dates to textual dates, or integer amounts to decimal amounts.