Ballerina Style Guide

The Ballerina Style Guide aims at maintaining a standard coding style among the Ballerina community. Therefore, the Ballerina code formatting tools are based on this guide.

You can follow your own coding style when writing Ballerina source code. Also, plugins and tools can be configured to match your coding style.

Indentation and line length

  • Use four spaces (not tabs) for each level of indentation.
  • Keep the maximum length of a line to 120 characters.

Note: You can configure tools and plugins to use tabs when indenting and to change the number of maximum characters of the line length.

Line spacing

  • Use only a single space to separate keywords, types, and identifiers.

Do's

public function getFullName() returns string {
    string fullName = "john doe";
    return fullName;
}

Don'ts

public   function   getFullName()   returns   string {
    string   fullName = "john doe";
    return     fullName;
}

Few exceptions for this rule are: - Do not keep spaces around a type when it is enclosed using angle brackets <string>.

Example,

map<string> names = {};
  • Do not keep spaces between the type and the opening bracket in the array definition string[].

Example,

    string[] names = [];
  • If it is a list of values separated by commas, add only a single space after each comma and don't add spaces before the comma.

Example,

[string, int, boolean] tupleVar = ["", 0, false];

int[] arrayOfString = [1, 2, 3, 4]

map<string> stringMap = {one: st1, two: st2, three: st3};

Person personRecord = {name:"marcus", id: 0};

function foo(string name, int id) {}

service hello on ep1, ep2 {...}

Blank lines

Separate both statements and top level definitions by zero or one blank lines.

Example,

import ballerina/http;
import ballerina/io;

const string CITY = "Colombo";
const int CITY_NO = 1;

function getName() returns string {
    string firstName = "john";
    string lastName = "doe";

    return firstName + lastName;
}

function setName(string name) {}
function setAge(int age) {}

Note: You can configure tools and plugins to change the number of minimum and maximum blank lines used when formatting.

Blocks

  • Opening curly braces of a block should be placed inline.

Do's

if (true) {
}

function setName(string name) {

}

Don'ts

if (true)
{

}

function setName(string name)
{

}
  • Add a single space before the opening curly braces.

Example,


function func1() {
    if (true) {}
}

  • If a block is empty, do not keep spaces in between the opening and closing braces.

Example,

function func1() {}
  • Indent all the statements inside a block to be at the same level.
  • Indent the closing brace of a block to align it with the starting position of the block statement.

Example,

if (false) {
   ...
}

match a {
   ...
}

Parentheses and Brackets

  • Do not have spaces after opening parentheses/bracket and before closing parentheses/bracket.

Example,

[string, int] tupleVar = ["", 0];

function setValue(string value) {...}

setValue("value");
  • To define an empty parentheses, do not keep spaces between the opening and closing parentheses ().

Example,

int | () result = getResult();

Line breaks

  • Have only one statement in a line.
  • When splitting lines, which contains operator(s), split them right before an operator.

Example,

// Binary operations.
string s = "added " + People.name
    + " in to database.";

// Function invocation.
string s = person
    .getName();

// Binary operations in if condition
if (isNameAvailable 
    && (i == 1)) {

}
  • When splitting lines, which contains separator(s), split them right after a separator.

Example,

// Function parameters.
function getName(int id, int age,
    string searchValue) returns string {
    ...
}
  • If there isn't any operator or separator to break the line from, move the whole expression to a new line.

Example,

// String literal.
string s1 =
    "My name is not in this description";

// Function invocation.
string s2 =
    getPersonNameWithUpperCaseLetters();
  • If a line exceeds the max line length, start from the end of the line and come towards the start of the line until you find a point, which matches the above rules to break the line.
  • Indent split lines with relation to the starting position of the statement or definition.

Example,

if (isNameAvailable 
    && (i == 1)) {

}

// Function parameters.
function getName(int id, int age,
    string searchValue) returns string {
    ...
}
  • However, if you cannot add the type-casting expression or statement with the constrained type in a single line due to it exceeding the max line length,
  • move the casting type with the operators to a new line.

Example,

    string name =
        <string>json.name;
  • keep the constrained type on the same line by splitting the statement from a point before the constraint type.

Example,

map<int | string> registry = {
    name: "marcus"
};

table<Employee> employee = table {
    {key id, name, address}
    };

Top Level Definitions

For style guidelines on imports, service definition, object definiiton, record definition, referencing record or abstract object, etc., see Top Level Definitions.

Operators, Keywords, and Types

For style guidelines on operators, keywords, and types, see Operators, Keywords, and Types.

Statements

For style guidelines on statemnets such as if, match, transcation etc., see Statements.

Expressions

For style guidelines on function invocation, literals, tuple, type casting etc. see Expressions.

Annotations, Documentation, and Comments

For style guidelines on annotations, documentation, and comments, see Annotations, Documentation, and Comments.