Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

To use SIL like any other scripting language follow a few simple syntax rules.

General rules

All instructions
Info

This topic provides an overview of the basic elements of the Simple Issue Language (SIL) scripting syntax.

Simple Issue Language (SIL) is a scripting language specifically designed for Jira. It follows common programming language conventions but is tailored to work with Jira issues and workflows. SIL is the underlying scripting language of Power Scripts, Power Actions, and other apps. It is easy to learn and work with.

Basic syntax rules

  • Every instruction must end with a semicolon ;

  • Comments

    are introduced using //comment_until_end_of_line or /* comment */
Code BlocktitleExample
  • can be written in two ways:

    Code Block
    // For single line 
comment
  • comments
    /* 
this
  • For multi-line 
comment
  • 
    
spans
  •  
over
  •  
multiple
  •  
lines
  • comments */

Types

Basic Types

SIL defines the following base types:

  • string - defines a string, example literal is "abc"
  • boolean - defines boolean values true and false
  • number - any numeric value
  • integer - a numeric value without a fractional component
  • byte - a byte
  • date - a date, like "2010-03-30"
  • interval - a time interval, like "2d 3h"

Important notes

  • interval - data type does not represent the working interval (i.e. 8h), but the full interval. When we created SIL™ we thought about if we should introduce a working interval type (i.e. 8h / day) but this would have certain undesired implications (how long is your workday? in France, for instance, Friday is only 6h). With our custom fields, it's a matter of interpretation of the interval, and we have routines to help you transform a 24h interval to a working interval, or you can simply write your own.
  • date - data type can be used to represent dates and date-times.
  • number - data type internal storage is represented only by real numbers (double). However, the language accepts for historical reasons type declarations as "real", "double", "float" (treating them as "number", of course).
  • integer (or int) - is actually a long in the traditional sense

Arrays

Multi-value (arrays) types are also supported and composed of the base type followed by the array symbols [ ]  for each dimension of the array type. This translates to the following being valid array types

Data types

Data types are templates or definitions that tell the system what kind of data can be stored. SIL uses several categories of data types.

Basic data types

Type

Use for

string

text values like hello

boolean

true/false values

number

any numeric value

integer

whole numbers without decimals

byte

for byte values

date

for dates like 2024-10-24

interval

for time periods like 2d 3h (two days and three hours)

Cfm background
widthSwitchauto
heightSwitchwrap text
backgroundColor#E9F2FF
imagePositionCenter
textColorPaletteDefault
textColor#091E42
imageOpacity1
minHeight1
an.spaceKeyPSJ
borderRadius0.03
width1
sideSpacing24
imageSizecover
idrmve5agyaxj
opacity1
alignmentstart
backgroundColorPaletteRecently used

Contents:

Table of Contents
minLevel1
maxLevel3
outlinefalse
styledefault
typelist
printabletrue

Complex data types

Arrays

Arrays are created by adding [] after any basic type. The following list represents valid arrays:

  • string[]

  • boolean[]

  • number[][]

  • integer[]

  • date[][][]

  • interval[]

You can also create arrays for a user-defined structure:

  • Person[][]

- where Person is a user-defined structure

Key-

Value Arrays (Maps)

value arrays

Arrays

are actually maps where values are keyed by their position

in SIL where positions in the list

, and so key

act as keys. Key-value arrays (or maps) are declared

the same as

like regular arrays.

Learn more about

maps and

using the indexing operator to create key-value maps and retrieve values from them.

Structures

The general

Structures are user-defined data types. A structure in SIL is like a container that can hold different types of data together. The syntax for defining a structure is:

Code Block
struct 
<name>
StructureName {
<type> <fieldName>; }Structures are defined by their name and pairs of field type and field name. A structure can have any number of fields.
    type1 field1;
    type2 field2;
    // ... more fields
}

The type of each field can be a

simple

basic data type, a user-defined structure

(including the structure being defined)

, a self-referential structure, or arrays of these types.

Example

The following examples show how to define a structure with each type:

Code Block
struct Person {
struct Address {
    string street;
    string city;
    string zipCode;         //Basic data types in structure
}

struct Employee {
    string id;
    
string name;
    Address workAddress;    // Structure inside structure
    Address homeAddress;
date birthDate; Person manager; Person [] subordinates; }
    // Can use same type multiple times
}
struct Department {
    string name;
    Department parent;            // A Department can reference itself
    Department[] subDepartments;  // Can have array of same type
}
Panel
panelIconId2699
panelIcon:gear:
panelIconText⚙️
bgColor#FFFAE6

Best practices when creating structures:

  • Use meaningful field names.

  • Group related fields together.

  • Consider the logical hierarchy of your data.

To access the value of a field from a variable in a structure, use the syntax

will look like

:

Code Block
<varName>.<fieldName>
Initializing Structures

You can initialize structures field-by-field:

Code Block
titleExample 1
// considering structure Person defined above Person p;  p
Employee emp;
emp.id = "E123";
emp.name = "John Doe";
p
emp.workAddress.
id
street = "
1234567
123 Work St";
string hisManager = p.manager.name; string employee = p.subordinates[0].name; Code Block
titleExample 2
struct P
emp.workAddress.city = "Work City";

Alternatively, you can do a one-line initialization, including nested initialization:

Code Block
struct Point {
    
int
integer x;
    
int
integer y;
}

Point p = 
int z; }
{10, 20};  // Initialize all fields at once

struct 
S
PersonInfo {
    string 
a
name;
    number 
b
salary;
  
date
 
c;
 Point 
P point
location;
}
;


S
PersonInfo 
s
person = {"
-text-
John Doe", 
3
50000.
14
00, 
"1974-03-15", {0, 1, 2
{10, 20}};
//one line
 
init
 //
you
 
do not have to expand the creation of the struct anymore //you do not need to quote them as strings

Constants

InfoThis topic is about constant values, NOT about the read-only Code Block
titleExample
integer n = 1;
Nested initialization


Literals

Literals are fixed values that appear directly in the code. In SIL, literals are used to represent constant values of different data types.

Note

Literals refer to the constant values used in scripts, NOT the use of a constant which is the readonly attribute of variables.

Single Value Constants

For numbers, integers and boolean values, constants are represented without any additional alterations.

Type

Basic type literals

Code Block
// Integer literals
integer a = 42;
integer b = -17;

// Number (floating point) literals
number pi = 3.14;
number temperature = -40.5;

// Boolean literals
boolean 
iLikeSIL
isTrue = true;
boolean isFalse = false;

//
bytes
 Bytes 
need
require explicit 
casts.
casting
since
byte 
the
b1 
literal
= 
is an integer
(byte) 20;
byte 
b
b2 = (byte) 
20;Constants for string, date and interval are provided between
255;  // maximum byte value

String, Date, and Interval literals

These types require double quotes (" ").

The full format for date is

Code Block
// String literals
string name = "John Doe";
string empty = "";  // empty string

// Date literals
// Full format: "yyyy-MM-ddTHH:mm:ss.SSSZ"
, and may include the time-zone information at the end. The short format "yyyy-MM-dd" is acceptedas well.
  • The intervals should be provided in the JIRA standard format: "1w 2d 3h 4m".
  • Code Block
    titleExample
    // valid dates "2010-12-31"
    
    date fullDate = "2010-12-31T24:59:59.999Z"; 
    (the
     
    default
    // 
    configured
    with 
    timezone
    milliseconds 
    is
    and 
    taken) "2010-12-31T24:59:59Z" (Zulu time = UTC = GMT)
    UTC
    date withZone = "2010-12-31T22:59:59+0200";  // with timezone (UTC+2)
    date simpleDate = "2010-12-
    31T24:59:59.999Z" (Zulu time = UTC = GMT) "2010-12-31T22:59:59.999+0200" (UTC+2) // interval
    31";              // just date
    
    // Interval literals
    // Format: combines w(weeks) d(days) h(hours) m(minutes)
    interval oneDay = "1d";
    interval complex = "1w 2d 3h 4m";  // 1 week, 2 days, 3 hours, 4 minutes
    interval justHours = "8h";

    Array

    Constants

    literals

    Arrays

    are created using the following syntax

    use curly braces and commas:

    Code Block
    {<value1>, <value2>, ..., <value3>}
    Code Block
    titleExample
    // One-dimensional arrays
    string[] names = {"this", "is", "a", "string", "array"};   
    number[] scores = {95.5, 87.0, 91.5};                                                                             
    boolean[] flags = {true, false, true};
    
    //
    string array {{0,1}, {2,3},
     Multi-dimensional arrays
    number[][] matrix = {
        {1, 2, 3},
        {4, 5, 6}
    }
    ,
     
    //
     
    number
     
    matrix
     {
    true
    7, 
    false
    8, 
    false
    9}
    };
    
    //
    boolean array
     Array of intervals
    interval[] durations = {"1d", "
    2d
    2h", "
    3d"} // interval array { variable1, variable2, variable3 } //
    30m"};
    Note

    Constant representation of key-value arrays is not supported. You can build one using the indexing operator.

    Special literals

    You can use null or nil to unset variables.

    Info

    The null and nil values were introduced in SIL version 5.8.0.0.

    Code Block
    number n = 0;
    .....
    n = uninitialized; // not recommended
    n = null;          // or:  
    n = nil;           // alternative syntax

    Variables

    Variables are named containers that use the data types. They are like labeled boxes that can hold specific values.

    Code Block
    // Variable format: <data type> <variable name>
    
    // Variable declaration:
    string name;    // A container that can hold text
    number pi;         // A container that can hold decimal numbers
    
    //You can also have an array of the type of variable#
    { variable1, variable2, variable3 }.    // where variable# can also be an array
    Note
    titleNote

    We currently do not support constant representation of key-value arrays. You will need to build one using the indexing operator.

    Variable Declaration

    The general syntax for declaring a variable is: 

    Code Block
    <type> varname; // declaration without initialization
    // or
    <type> varname = <expression>; // declaration with initialization

     

    Code Block
    titleExample
    string name = "John Doe";

    You can create an array from variables as illustrated in the following example:

    Code Block
    // First, declare some variables
    string name1 = "John";
    string name2 = "Jane";
    string name3 = "Bob";
    
    // Create an array from these variables
    string[] names = {name1, name2, name3};
    // Result: names = {"John", "Jane", "Bob"}

    You can also create array variables:

    Code Block
    // First, declare some array variables
    string[] teamA = {"John", "Jane"};
    string[] teamB = {"Bob", "Alice"};
    string[] teamC = {"Charlie", "David"};
    
    // Create an array of arrays from these variables
    string[][] allTeams = {teamA, teamB, teamC};
    // Result: allTeams = {
    //     {"John", "Jane"},
    //     {"Bob", "Alice"},
    //     {"Charlie", "David"}
    // }

    Variable declaration and initialization

    To give value to your variables, you initialize them either when you declare them or later.

    Code Block
    string employeeName;               // Just declaring
    employeeName = "John";             // Initializing after declaration
    
    string employeeAge = 25;           // Declare and initialize at once
    
    // More examples of variable declaration
    integer random = 2;
    number pi = 3.14;
    boolean valid;
    date today = currentDate();
    interval spent = "1h 30m";
    interval estimate = "2d" - spent;
    number [][] matrix = {{0,1}, {2,3}, {4,5}};
    Constant variables

    Constants

    Variables can be made

    read-only

    readonly by adding the keyword

    "

    const

    "

    before the data type when the variable is first defined.

    Code Block
    const string COMMA = ",";
    const number PI = 3.14;

    If set to an array or structure, the

    read-only

    readonly attribute will be applied to all the elements of the array or all fields of the structure.

    Routine Declaration

    In addition to the routines provided out-of-the-box by SIL, you can define your local routines (user-defined routines or UDRs in short) that use the following syntax:

    Code Block
    function <name>(<type> param1, <type> param2, ...) {
       Instruction1;
       ...
       InstructionN;
       return <value>;
    }

    Learn more about UDRs.

    Explicit Type Casts

    Most of the time, SIL™ will attempt to do the type-casting for you automatically, however this cannot be always performed like this. These type casts allow you explicitly to convert a variable to a specific type.The general syntax for casting istitleExample

    Explicit type casting

    When types are compatible, SIL automatically converts one type to another. Automatic conversion can lead to ambiguous results. If you want to tell SIL how to convert a type, use explicit type casting with the following syntax:

    Code Block
    (<target_type>)varname
    Code Block

     The following example illustrates how explicit type casting returns accurate results:

    Code Block
    integer n = 1;
    number x = 3.14;
    string s = "2";
    
    //Ambiguous - could mean different things:
    return n + s; // 
    what
    SIL 
    will
    doesn't 
    this
    know 
    return?
    if 
    3
    you 
    or
    want "12"
    ?
     or 3
    
    //Explicit - clearn intentions:
    return (string)n + s; //
    now we know that adding 2 strings will result in
     Forces n to be treated as string "1" - clearly wants a string "12"
    return n + (number)s; // 
    adding
    Forces s to be treated as number 2 
    numbers
    - 
    will
    clearly 
    definitely return
    wants a number (3)

    Note

    title

    Note

    : Not all type casts are valid.

    For example it makes no sense to convert

    Converting an interval to a date or a date

    .

    See also

    Type conversion

    Contents

    toc

    to a string is an example of invalid type casting.


    User-defined functions

    SIL comes with many out-of-the-box functions by SIL, but allows you to define local functions, referred to as user-defined routines (UDRs). To define and declare a function, use this general syntax:

    Code Block
    function <name>(<type> param1, <type> param2, ...) {
       Instruction1;
       ...
       InstructionN;
       return <value>;
    }

    For additional details, check the User-defined routines (UDRs) topic.