# Рантайм

Здесь описаны функции для работы с виртуальной машиной во время выполнения скрипта.

* [error( int id, str text, anytype pars... )](#error-int-id-str-text-anytype-pars)
* [ErrID( error err ) int](#errid-error-err-int)
* [ErrText( error err ) str](#errtext-error-err-str)
* [ErrTrace( error err ) arr.trace](#errtrace-error-err-arr-trace)
* [exit( int code )](#exit-int-code)
* [Progress( int id inc )](#progress-int-id-inc)
* [ProgressEnd( int id )](#progressend-int-id)
* [ProgressStart( int total ptype, str src dest ) int](#progressstart-int-total-ptype-str-src-dest-int)
* [Trace() arr.trace](#trace-arr-trace)

## Типы

### trace

Тип *trace* служит для хранения информации о вызове функции и имеет следующие поля:

* **str Path** - имя файла
* **str Entry** - текущая функция
* **str Func** - вызываемая функция
* **int Line** - строка в исходном коде
* **int Pos** - позиция в строке, где произошёл вызов

## Функции

### error(int id, str text, anytype pars...)

Функция *error* генерирует ошибку времени выполнения скрипта.

* *id* - код ошибки,
* *text* - текст ошибки,
* *pars* - необязательные параметры. Если они указаны, то *text* должен содержать соответствующий шаблон

  как в функции [Format](https://gentee.github.io/docs-gentee-ru/stdlib/string#formatstr-s-anytype-args-str).

```go
    error(10, `Error message %{ 10 }`)
    error(10, `Error message %d`, 10)
```

### ErrID(error err) int

Функция *ErrID* возвращает идентификатор ошибки *err*. Эта функция может использоваться внутри конструкции **try-catch** для обработки ошибок.

```go
run {
  try {
    .....
    error(101, `oooops`)
  }
  catch err {
    if ErrID(err) == 101 {
      recover
    } elif ErrID(err) < 100 {
      retry
    }
  }
}
```

### ErrText(error err) str

Функция *ErrText* возвращает текст ошибки *err*. Эта функция может использоваться внутри конструкции **try-catch** для обработки ошибок.

### ErrTrace(error err) arr.trace

Функция *ErrTrace* возвращает стек вызовов функций на момент возникновения ошибки *err*. Эта функция может использоваться внутри конструкции **try-catch** для обработки ошибок.

### exit(int code)

Функция *exit* прекращает работу скрипта. Функция может быть вызвана в любом потоке. Скрипт возвращает значение *code*.

```go
func ok(int par) int {
  if par == 0 : exit(0)
  return 3 * par
}
run int {
  int sum
  for i in 10..-10 {
    sum += ok(i)
  }
  return sum
}
```

### Progress( int id inc )

Функция *Progress* увеличивает величину счётчика процесса на значение параметра *inc*. *id* - идентификатор прогресс-бара возвращённый функцией *ProgressStart*. Функция *Progress* вызывает Go функцию *ProgressFunc*, которая должна быть определена в настройках при запуске скрипта.

```go
  int total = 200
  int prog = ProgressStart(total, 100, `counter`, ``)
  for i in 1..5 {
    Progress(prog, 40)
  }
  ProgressEnd(prog)
```

### ProgressEnd( int id )

Функция *ProgressEnd* удаляет счётчик процесса с идентификатором *id*.

### ProgressStart( int total ptype, str src dest ) int

Функция *ProgressStart* создаёт счётчик процесса и возвращает его идентификатор. *total* - максимальная величина счётчика. *ptype* - тип счётчика, может быть любое число. *src* - имя источника. *dest* - имя целевого объекта. Функции для работы с прогрессом-баром ничего не отображают, они вызывают функцию *ProgressFunc*, которая должна быть определена в [настройках](https://ru.gentee.org/golang/reference) при запуске скрипта. В функции *ProgressFunc* вы можете отображать состояние процесса удобным для вас способом. После окончания работы с данным счётчиком необходимо вызвать функцию *ProgressEnd* для его удаления.

### Trace() arr.trace

Функция *Trace* возвращает стек вызовов функций.
