Importing external code and data
It is possible to import external arr.ai scripts. Every imported arr.ai script must be a valid arr.ai expression. There are multiple ways to import arr.ai scripts.
Package Imports
Package imports allow for importing files relative to a "root". The root for a script is the location of the nearest go.mod file, in either the same directory as the importing script or an ancestor directory.
You may define multiple go.mod files in the same repository to create multiple import roots for different parts of the codebase.
Example:
//{/path/to/script}
With the following directories structure:
project
├── go.mod
├── nested
│ ├── child1.arrai
│ ├── go.mod
│ └── path
│ └── to
│ └── grandchildren.arrai
├── parent.arrai
└── path
└── to
└── child2.arrai
In that scenario, the root path of parent.arrai and path/to/child2.arrai is
project/ and the root path for nested/child1.arraiand
nested/path/to/grandchildren.arrai is project/nested/. This means that any
Package imports in parent.arrai and child2.arrai will be relative to
project/ and Package imports in child1.arrai and grandchildren.arrai will
be relative to project/nested.
Relative Imports
It is possible to import a script relative to the importer's directory.
A relative import path begins with a .. For example:
//{./path/to/script}
It is not possible to import anything from the parent directories.
# this is not allowed
//{../script}
//{./../../script}
However, sometimes importing above the parent directory might be necessary for
testing locally. It is possible to work around this by using the Package import
and go.mod. Since go.mod also handles dependencies of arr.ai scripts, it is
possible to use replace to a dependency so that it points to a custom URL or
a filepath.
Example:
go.mod
go 1.15
require some/dependency/path v1.2.3
replace some/dependency/path v1.2.3 => ../some/custom/dependency
Note: There are plans to deprecate the use of Go dependencies and go.mod for managing arr.ai imports. Whatever the new solution is will have an equivalent mechanism for replace.
Remote Imports
Remote imports allow importing of an arr.ai script that is hosted in a GitHub repository. This can be done by the following:
//{github.com/username/repo_name/path/to/script}
Versioning
By default, arrai fetches the latest available version of the repository.
If the importing script's project has a go.mod (found the same way as for
Package Imports above) that already requires the module being imported, that
pinned version is used instead — including following a replace directive
that points it at a fork or a local filepath. This lets you pin or override
remote imports the same way you would a regular Go dependency:
require github.com/username/repo_name v1.2.3
replace github.com/username/repo_name => ../local/fork
It is not possible to pin a version inline in the import path itself (e.g.
//{github.com/username/repo_name@v1.2.3/path/to/script}); add or update the
require line in go.mod instead.
HTTP Imports
HTTP imports allow importing of a remotely-hosted arr.ai script given its URL. The server must return an arr.ai script as a text. This can be done by the following:
//{http://www.somewebsite.com/path/to/arrai}
or
//{https://www.somewebsite.com/path/to/arrai}
Non-arr.ai import
arr.ai supports importing of non-arr.ai files. The currently supported files are the following file formats:
- JSON
- YAML
This can be done by adding the file extension to explicitly state file format like the following:
//{./path/to/file.json}
For importing arr.ai scripts, it is not necessary to add the .arrai
extension as it is always assumed that the files are arr.ai scripts, unless
explicitly stated.