Values are the data that Sentinel policies operate on. You can create this
data yourself, for example by just typing the number 42, or you may access
this data from an external source to make policy decisions.

Values have a type, which determines what kind of operatins can be performed
on the data. Example types are booleans (true and false), numbers,
and strings (text).

As a policy language, booleans are central to the behavior of Sentinel.
Booleans are used as conditions in if statements,
are the result of rules, and more. The ultimate
result of a Sentinel policy is true or false.

An integer is a 64-bit value. This means it can represent numbers from
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,808.

Integers are created by typing them out literally with no
separators (such as a comma). An optional prefix can set a non-decimal base:
0 for octal, and 0x for hexadecimal. In hexadecimal literals, letters
a-f and A-F represent values 10 to 15.

Strings are created by wrapping text in double quotes, such as "hello".
Within the quotes, any character may appear except newline and an unescaped
double quote. The text between the quotes is the value.

Because Sentinel policies must be UTF-8 encoded text, strings themselves are
UTF-8 encoded text. This means you can put any value UTF-8 character into
a string, such as "日本語".

You can have a string with a literal double-quote by escaping it with
a backslash. For example: "they said \"hello\"" turns into the value
they said "hello".

Backslash escapes can be used for much more than only escaping a double quote.
Newlines are \n, a literal backslash is \\, and many more. The full list
of available backslash escapes can be found
in the language specification.

Strings support indexing. Indexing a string will access that byte
in the string as if the string were a byte array. This is an important
distinction: it will not access the character at that position if you're
using multi-byte characters.