clang-format
diff --git a/.clang-format b/.clang-format
index 5486ac5..3a48294 100644
--- a/.clang-format
+++ b/.clang-format
@@ -1,7 +1,14 @@
 ---
+BasedOnStyle: LLVM
+IndentWidth: 2
+ColumnLimit: 160
+
+---
 Language: Cpp
 
-BasedOnStyle: LLVM
-ColumnLimit: 120
 SpaceBeforeCpp11BracedList: true
+PointerAlignment: Left
+AllowShortFunctionsOnASingleLine: Empty
+AllowShortBlocksOnASingleLine: Empty
+SpaceBeforeCtorInitializerColon: false
 ...
diff --git a/include/inja/environment.hpp b/include/inja/environment.hpp
index 9e6f7c4..a652935 100644
--- a/include/inja/environment.hpp
+++ b/include/inja/environment.hpp
@@ -32,12 +32,11 @@
   TemplateStorage template_storage;
 
 public:
-  Environment() : Environment("") {}
+  Environment(): Environment("") {}
 
-  explicit Environment(const std::string& global_path) : input_path(global_path), output_path(global_path) {}
+  explicit Environment(const std::string& global_path): input_path(global_path), output_path(global_path) {}
 
-  Environment(const std::string& input_path, const std::string& output_path)
-      : input_path(input_path), output_path(output_path) {}
+  Environment(const std::string& input_path, const std::string& output_path): input_path(input_path), output_path(output_path) {}
 
   /// Sets the opener and closer for template statements
   void set_statement(const std::string& open, const std::string& close) {
@@ -109,7 +108,9 @@
     return parse_template(filename);
   }
 
-  std::string render(std::string_view input, const json& data) { return render(parse(input), data); }
+  std::string render(std::string_view input, const json& data) {
+    return render(parse(input), data);
+  }
 
   std::string render(const Template& tmpl, const json& data) {
     std::stringstream os;
@@ -138,8 +139,7 @@
     file.close();
   }
 
-  void write_with_json_file(const std::string& filename, const std::string& filename_data,
-                            const std::string& filename_out) {
+  void write_with_json_file(const std::string& filename, const std::string& filename_data, const std::string& filename_out) {
     const json data = load_json(filename_data);
     write(filename, data, filename_out);
   }
@@ -195,7 +195,10 @@
   @brief Adds a void callback with given number or arguments
   */
   void add_void_callback(const std::string& name, int num_args, const VoidCallbackFunction& callback) {
-    function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
+    function_storage.add_callback(name, num_args, [callback](Arguments& args) {
+      callback(args);
+      return json();
+    });
   }
 
   /** Includes a template with a given name into the environment.
diff --git a/include/inja/exceptions.hpp b/include/inja/exceptions.hpp
index b1458b4..f0dc8aa 100644
--- a/include/inja/exceptions.hpp
+++ b/include/inja/exceptions.hpp
@@ -17,30 +17,29 @@
 
   const SourceLocation location;
 
-  explicit InjaError(const std::string &type, const std::string &message)
+  explicit InjaError(const std::string& type, const std::string& message)
       : std::runtime_error("[inja.exception." + type + "] " + message), type(type), message(message), location({0, 0}) {}
 
-  explicit InjaError(const std::string &type, const std::string &message, SourceLocation location)
-      : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" +
-                           std::to_string(location.column) + ") " + message),
+  explicit InjaError(const std::string& type, const std::string& message, SourceLocation location)
+      : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" + std::to_string(location.column) + ") " + message),
         type(type), message(message), location(location) {}
 };
 
 struct ParserError : public InjaError {
-  explicit ParserError(const std::string &message, SourceLocation location) : InjaError("parser_error", message, location) {}
+  explicit ParserError(const std::string& message, SourceLocation location): InjaError("parser_error", message, location) {}
 };
 
 struct RenderError : public InjaError {
-  explicit RenderError(const std::string &message, SourceLocation location) : InjaError("render_error", message, location) {}
+  explicit RenderError(const std::string& message, SourceLocation location): InjaError("render_error", message, location) {}
 };
 
 struct FileError : public InjaError {
-  explicit FileError(const std::string &message) : InjaError("file_error", message) {}
-  explicit FileError(const std::string &message, SourceLocation location) : InjaError("file_error", message, location) {}
+  explicit FileError(const std::string& message): InjaError("file_error", message) {}
+  explicit FileError(const std::string& message, SourceLocation location): InjaError("file_error", message, location) {}
 };
 
 struct DataError : public InjaError {
-  explicit DataError(const std::string &message, SourceLocation location) : InjaError("data_error", message, location) {}
+  explicit DataError(const std::string& message, SourceLocation location): InjaError("data_error", message, location) {}
 };
 
 } // namespace inja
diff --git a/include/inja/function_storage.hpp b/include/inja/function_storage.hpp
index 1a6641f..891e45f 100644
--- a/include/inja/function_storage.hpp
+++ b/include/inja/function_storage.hpp
@@ -4,7 +4,6 @@
 #include <string_view>
 #include <vector>
 
-
 namespace inja {
 
 using Arguments = std::vector<const json*>;
@@ -69,7 +68,7 @@
   };
 
   struct FunctionData {
-    explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction{}) : operation(op), callback(cb) {}
+    explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
     const Operation operation;
     const CallbackFunction callback;
   };
@@ -78,44 +77,44 @@
   const int VARIADIC {-1};
 
   std::map<std::pair<std::string, int>, FunctionData> function_storage = {
-    {std::make_pair("at", 2), FunctionData { Operation::At }},
-    {std::make_pair("default", 2), FunctionData { Operation::Default }},
-    {std::make_pair("divisibleBy", 2), FunctionData { Operation::DivisibleBy }},
-    {std::make_pair("even", 1), FunctionData { Operation::Even }},
-    {std::make_pair("exists", 1), FunctionData { Operation::Exists }},
-    {std::make_pair("existsIn", 2), FunctionData { Operation::ExistsInObject }},
-    {std::make_pair("first", 1), FunctionData { Operation::First }},
-    {std::make_pair("float", 1), FunctionData { Operation::Float }},
-    {std::make_pair("int", 1), FunctionData { Operation::Int }},
-    {std::make_pair("isArray", 1), FunctionData { Operation::IsArray }},
-    {std::make_pair("isBoolean", 1), FunctionData { Operation::IsBoolean }},
-    {std::make_pair("isFloat", 1), FunctionData { Operation::IsFloat }},
-    {std::make_pair("isInteger", 1), FunctionData { Operation::IsInteger }},
-    {std::make_pair("isNumber", 1), FunctionData { Operation::IsNumber }},
-    {std::make_pair("isObject", 1), FunctionData { Operation::IsObject }},
-    {std::make_pair("isString", 1), FunctionData { Operation::IsString }},
-    {std::make_pair("last", 1), FunctionData { Operation::Last }},
-    {std::make_pair("length", 1), FunctionData { Operation::Length }},
-    {std::make_pair("lower", 1), FunctionData { Operation::Lower }},
-    {std::make_pair("max", 1), FunctionData { Operation::Max }},
-    {std::make_pair("min", 1), FunctionData { Operation::Min }},
-    {std::make_pair("odd", 1), FunctionData { Operation::Odd }},
-    {std::make_pair("range", 1), FunctionData { Operation::Range }},
-    {std::make_pair("round", 2), FunctionData { Operation::Round }},
-    {std::make_pair("sort", 1), FunctionData { Operation::Sort }},
-    {std::make_pair("upper", 1), FunctionData { Operation::Upper }},
-    {std::make_pair("super", 0), FunctionData { Operation::Super }},
-    {std::make_pair("super", 1), FunctionData { Operation::Super }},
-    {std::make_pair("join", 2), FunctionData { Operation::Join }},
+      {std::make_pair("at", 2), FunctionData {Operation::At}},
+      {std::make_pair("default", 2), FunctionData {Operation::Default}},
+      {std::make_pair("divisibleBy", 2), FunctionData {Operation::DivisibleBy}},
+      {std::make_pair("even", 1), FunctionData {Operation::Even}},
+      {std::make_pair("exists", 1), FunctionData {Operation::Exists}},
+      {std::make_pair("existsIn", 2), FunctionData {Operation::ExistsInObject}},
+      {std::make_pair("first", 1), FunctionData {Operation::First}},
+      {std::make_pair("float", 1), FunctionData {Operation::Float}},
+      {std::make_pair("int", 1), FunctionData {Operation::Int}},
+      {std::make_pair("isArray", 1), FunctionData {Operation::IsArray}},
+      {std::make_pair("isBoolean", 1), FunctionData {Operation::IsBoolean}},
+      {std::make_pair("isFloat", 1), FunctionData {Operation::IsFloat}},
+      {std::make_pair("isInteger", 1), FunctionData {Operation::IsInteger}},
+      {std::make_pair("isNumber", 1), FunctionData {Operation::IsNumber}},
+      {std::make_pair("isObject", 1), FunctionData {Operation::IsObject}},
+      {std::make_pair("isString", 1), FunctionData {Operation::IsString}},
+      {std::make_pair("last", 1), FunctionData {Operation::Last}},
+      {std::make_pair("length", 1), FunctionData {Operation::Length}},
+      {std::make_pair("lower", 1), FunctionData {Operation::Lower}},
+      {std::make_pair("max", 1), FunctionData {Operation::Max}},
+      {std::make_pair("min", 1), FunctionData {Operation::Min}},
+      {std::make_pair("odd", 1), FunctionData {Operation::Odd}},
+      {std::make_pair("range", 1), FunctionData {Operation::Range}},
+      {std::make_pair("round", 2), FunctionData {Operation::Round}},
+      {std::make_pair("sort", 1), FunctionData {Operation::Sort}},
+      {std::make_pair("upper", 1), FunctionData {Operation::Upper}},
+      {std::make_pair("super", 0), FunctionData {Operation::Super}},
+      {std::make_pair("super", 1), FunctionData {Operation::Super}},
+      {std::make_pair("join", 2), FunctionData {Operation::Join}},
   };
 
 public:
   void add_builtin(std::string_view name, int num_args, Operation op) {
-    function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { op });
+    function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {op});
   }
 
   void add_callback(std::string_view name, int num_args, const CallbackFunction& callback) {
-    function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { Operation::Callback, callback });
+    function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {Operation::Callback, callback});
   }
 
   FunctionData find_function(std::string_view name, int num_args) const {
@@ -123,7 +122,7 @@
     if (it != function_storage.end()) {
       return it->second;
 
-    // Find variadic function
+      // Find variadic function
     } else if (num_args > 0) {
       it = function_storage.find(std::make_pair(static_cast<std::string>(name), VARIADIC));
       if (it != function_storage.end()) {
@@ -131,7 +130,7 @@
       }
     }
 
-    return FunctionData { Operation::None };
+    return FunctionData {Operation::None};
   }
 };
 
diff --git a/include/inja/inja.hpp b/include/inja/inja.hpp
index 1434f57..381da4b 100644
--- a/include/inja/inja.hpp
+++ b/include/inja/inja.hpp
@@ -4,7 +4,7 @@
   | || '_ \ | |/ _` |   Licensed under the MIT License <http://opensource.org/licenses/MIT>.
   | || | | || | (_| |
  |___|_| |_|/ |\__,_|   Copyright (c) 2018-2021 Lars Berscheid
-          |__/       
+          |__/
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
@@ -29,24 +29,26 @@
 
 namespace inja {
 #ifndef INJA_DATA_TYPE
-  using json = nlohmann::json;
+using json = nlohmann::json;
 #else
-  using json = INJA_DATA_TYPE;
+using json = INJA_DATA_TYPE;
 #endif
-}
+} // namespace inja
 
 #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(INJA_NOEXCEPTION)
-  #ifndef INJA_THROW
-    #define INJA_THROW(exception) throw exception
-  #endif
+#ifndef INJA_THROW
+#define INJA_THROW(exception) throw exception
+#endif
 #else
-  #include <cstdlib>
-  #ifndef INJA_THROW
-    #define INJA_THROW(exception) std::abort(); std::ignore = exception
-  #endif
-  #ifndef INJA_NOEXCEPTION
-    #define INJA_NOEXCEPTION
-  #endif
+#include <cstdlib>
+#ifndef INJA_THROW
+#define INJA_THROW(exception)                                                                                                                                  \
+  std::abort();                                                                                                                                                \
+  std::ignore = exception
+#endif
+#ifndef INJA_NOEXCEPTION
+#define INJA_NOEXCEPTION
+#endif
 #endif
 
 #include "environment.hpp"
diff --git a/include/inja/lexer.hpp b/include/inja/lexer.hpp
index 5f45da1..c777600 100644
--- a/include/inja/lexer.hpp
+++ b/include/inja/lexer.hpp
@@ -43,7 +43,6 @@
   size_t tok_start;
   size_t pos;
 
-
   Token scan_body(std::string_view close, Token::Kind closeKind, std::string_view close_trim = std::string_view(), bool trim = false) {
   again:
     // skip whitespace (except for \n as it might be a close)
@@ -224,7 +223,9 @@
     return make_token(Token::Kind::String);
   }
 
-  Token make_token(Token::Kind kind) const { return Token(kind, string_view::slice(m_in, tok_start, pos)); }
+  Token make_token(Token::Kind kind) const {
+    return Token(kind, string_view::slice(m_in, tok_start, pos));
+  }
 
   void skip_whitespaces_and_newlines() {
     if (pos < m_in.size()) {
@@ -270,7 +271,7 @@
   }
 
 public:
-  explicit Lexer(const LexerConfig& config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
+  explicit Lexer(const LexerConfig& config): config(config), state(State::Text), minus_state(MinusState::Number) {}
 
   SourceLocation current_position() const {
     return get_source_location(m_in, tok_start);
@@ -322,7 +323,7 @@
       } else if (inja::string_view::starts_with(open_str, config.statement_open)) {
         if (inja::string_view::starts_with(open_str, config.statement_open_no_lstrip)) {
           state = State::StatementStartNoLstrip;
-        } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip )) {
+        } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip)) {
           state = State::StatementStartForceLstrip;
           must_lstrip = true;
         } else {
diff --git a/include/inja/node.hpp b/include/inja/node.hpp
index 2df0054..1946805 100644
--- a/include/inja/node.hpp
+++ b/include/inja/node.hpp
@@ -8,7 +8,6 @@
 #include "function_storage.hpp"
 #include "utils.hpp"
 
-
 namespace inja {
 
 class NodeVisitor;
@@ -29,7 +28,6 @@
 class BlockStatementNode;
 class SetStatementNode;
 
-
 class NodeVisitor {
 public:
   virtual ~NodeVisitor() = default;
@@ -61,16 +59,15 @@
 
   size_t pos;
 
-  AstNode(size_t pos) : pos(pos) { }
-  virtual ~AstNode() { }
+  AstNode(size_t pos): pos(pos) {}
+  virtual ~AstNode() {}
 };
 
-
 class BlockNode : public AstNode {
 public:
   std::vector<std::shared_ptr<AstNode>> nodes;
 
-  explicit BlockNode() : AstNode(0) {}
+  explicit BlockNode(): AstNode(0) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -81,7 +78,7 @@
 public:
   const size_t length;
 
-  explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) { }
+  explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -90,7 +87,7 @@
 
 class ExpressionNode : public AstNode {
 public:
-  explicit ExpressionNode(size_t pos) : AstNode(pos) {}
+  explicit ExpressionNode(size_t pos): AstNode(pos) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -101,7 +98,7 @@
 public:
   const json value;
 
-  explicit LiteralNode(std::string_view data_text, size_t pos) : ExpressionNode(pos), value(json::parse(data_text)) { }
+  explicit LiteralNode(std::string_view data_text, size_t pos): ExpressionNode(pos), value(json::parse(data_text)) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -124,7 +121,7 @@
     return result;
   }
 
-  explicit DataNode(std::string_view ptr_name, size_t pos) : ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) { }
+  explicit DataNode(std::string_view ptr_name, size_t pos): ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -150,98 +147,99 @@
   std::vector<std::shared_ptr<ExpressionNode>> arguments;
   CallbackFunction callback;
 
-  explicit FunctionNode(std::string_view name, size_t pos) : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) { }
-  explicit FunctionNode(Op operation, size_t pos) : ExpressionNode(pos), operation(operation), number_args(1) {
+  explicit FunctionNode(std::string_view name, size_t pos)
+      : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) {}
+  explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos), operation(operation), number_args(1) {
     switch (operation) {
-      case Op::Not: {
-        number_args = 1;
-        precedence = 4;
-        associativity = Associativity::Left;
-      } break;
-      case Op::And: {
-        number_args = 2;
-        precedence = 1;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Or: {
-        number_args = 2;
-        precedence = 1;
-        associativity = Associativity::Left;
-      } break;
-      case Op::In: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Equal: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::NotEqual: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Greater: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::GreaterEqual: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Less: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::LessEqual: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Add: {
-        number_args = 2;
-        precedence = 3;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Subtract: {
-        number_args = 2;
-        precedence = 3;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Multiplication: {
-        number_args = 2;
-        precedence = 4;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Division: {
-        number_args = 2;
-        precedence = 4;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Power: {
-        number_args = 2;
-        precedence = 5;
-        associativity = Associativity::Right;
-      } break;
-      case Op::Modulo: {
-        number_args = 2;
-        precedence = 4;
-        associativity = Associativity::Left;
-      } break;
-      case Op::AtId: {
-        number_args = 2;
-        precedence = 8;
-        associativity = Associativity::Left;
-      } break;
-      default: {
-        precedence = 1;
-        associativity = Associativity::Left;
-      }
+    case Op::Not: {
+      number_args = 1;
+      precedence = 4;
+      associativity = Associativity::Left;
+    } break;
+    case Op::And: {
+      number_args = 2;
+      precedence = 1;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Or: {
+      number_args = 2;
+      precedence = 1;
+      associativity = Associativity::Left;
+    } break;
+    case Op::In: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Equal: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::NotEqual: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Greater: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::GreaterEqual: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Less: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::LessEqual: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Add: {
+      number_args = 2;
+      precedence = 3;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Subtract: {
+      number_args = 2;
+      precedence = 3;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Multiplication: {
+      number_args = 2;
+      precedence = 4;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Division: {
+      number_args = 2;
+      precedence = 4;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Power: {
+      number_args = 2;
+      precedence = 5;
+      associativity = Associativity::Right;
+    } break;
+    case Op::Modulo: {
+      number_args = 2;
+      precedence = 4;
+      associativity = Associativity::Left;
+    } break;
+    case Op::AtId: {
+      number_args = 2;
+      precedence = 8;
+      associativity = Associativity::Left;
+    } break;
+    default: {
+      precedence = 1;
+      associativity = Associativity::Left;
+    }
     }
   }
 
@@ -254,8 +252,8 @@
 public:
   std::shared_ptr<ExpressionNode> root;
 
-  explicit ExpressionListNode() : AstNode(0) { }
-  explicit ExpressionListNode(size_t pos) : AstNode(pos) { }
+  explicit ExpressionListNode(): AstNode(0) {}
+  explicit ExpressionListNode(size_t pos): AstNode(pos) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -264,7 +262,7 @@
 
 class StatementNode : public AstNode {
 public:
-  StatementNode(size_t pos) : AstNode(pos) { }
+  StatementNode(size_t pos): AstNode(pos) {}
 
   virtual void accept(NodeVisitor& v) const = 0;
 };
@@ -273,9 +271,9 @@
 public:
   ExpressionListNode condition;
   BlockNode body;
-  BlockNode *const parent;
+  BlockNode* const parent;
 
-  ForStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent) { }
+  ForStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent) {}
 
   virtual void accept(NodeVisitor& v) const = 0;
 };
@@ -284,7 +282,7 @@
 public:
   const std::string value;
 
-  explicit ForArrayStatementNode(const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), value(value) { }
+  explicit ForArrayStatementNode(const std::string& value, BlockNode* const parent, size_t pos): ForStatementNode(parent, pos), value(value) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -296,7 +294,8 @@
   const std::string key;
   const std::string value;
 
-  explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), key(key), value(value) { }
+  explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode* const parent, size_t pos)
+      : ForStatementNode(parent, pos), key(key), value(value) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -308,13 +307,13 @@
   ExpressionListNode condition;
   BlockNode true_statement;
   BlockNode false_statement;
-  BlockNode *const parent;
+  BlockNode* const parent;
 
   const bool is_nested;
   bool has_false_statement {false};
 
-  explicit IfStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(false) { }
-  explicit IfStatementNode(bool is_nested, BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(is_nested) { }
+  explicit IfStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(false) {}
+  explicit IfStatementNode(bool is_nested, BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(is_nested) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -325,7 +324,7 @@
 public:
   const std::string file;
 
-  explicit IncludeStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+  explicit IncludeStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -336,7 +335,7 @@
 public:
   const std::string file;
 
-  explicit ExtendsStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+  explicit ExtendsStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -347,9 +346,9 @@
 public:
   const std::string name;
   BlockNode block;
-  BlockNode *const parent;
+  BlockNode* const parent;
 
-  explicit BlockStatementNode(BlockNode *const parent, const std::string& name, size_t pos) : StatementNode(pos), name(name), parent(parent) { }
+  explicit BlockStatementNode(BlockNode* const parent, const std::string& name, size_t pos): StatementNode(pos), name(name), parent(parent) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -361,7 +360,7 @@
   const std::string key;
   ExpressionListNode expression;
 
-  explicit SetStatementNode(const std::string& key, size_t pos) : StatementNode(pos), key(key) { }
+  explicit SetStatementNode(const std::string& key, size_t pos): StatementNode(pos), key(key) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
diff --git a/include/inja/parser.hpp b/include/inja/parser.hpp
index 61e2aa8..3ea1793 100644
--- a/include/inja/parser.hpp
+++ b/include/inja/parser.hpp
@@ -16,7 +16,6 @@
 #include "token.hpp"
 #include "utils.hpp"
 
-
 namespace inja {
 
 /*!
@@ -38,8 +37,8 @@
 
   std::string_view literal_start;
 
-  BlockNode *current_block {nullptr};
-  ExpressionListNode *current_expression_list {nullptr};
+  BlockNode* current_block {nullptr};
+  ExpressionListNode* current_expression_list {nullptr};
   std::stack<std::pair<FunctionNode*, size_t>> function_stack;
   std::vector<std::shared_ptr<ExpressionNode>> arguments;
 
@@ -110,7 +109,6 @@
           template_storage.emplace(template_name, include_template);
           parse_into_template(template_storage[template_name], template_name);
           return;
-
         } else if (!config.include_callback) {
           INJA_THROW(FileError("failed accessing file at '" + template_name + "'"));
         }
@@ -137,7 +135,7 @@
     return std::string {tok.text.substr(1, tok.text.length() - 2)};
   }
 
-  bool parse_expression(Template &tmpl, Token::Kind closing) {
+  bool parse_expression(Template& tmpl, Token::Kind closing) {
     while (tok.kind != closing && tok.kind != Token::Kind::Eof) {
       // Literals
       switch (tok.kind) {
@@ -146,28 +144,24 @@
           literal_start = tok.text;
           add_literal(tmpl.content.c_str());
         }
-
       } break;
       case Token::Kind::Number: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
           literal_start = tok.text;
           add_literal(tmpl.content.c_str());
         }
-
       } break;
       case Token::Kind::LeftBracket: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
           literal_start = tok.text;
         }
         current_bracket_level += 1;
-
       } break;
       case Token::Kind::LeftBrace: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
           literal_start = tok.text;
         }
         current_brace_level += 1;
-
       } break;
       case Token::Kind::RightBracket: {
         if (current_bracket_level == 0) {
@@ -178,7 +172,6 @@
         if (current_brace_level == 0 && current_bracket_level == 0) {
           add_literal(tmpl.content.c_str());
         }
-
       } break;
       case Token::Kind::RightBrace: {
         if (current_brace_level == 0) {
@@ -189,33 +182,33 @@
         if (current_brace_level == 0 && current_bracket_level == 0) {
           add_literal(tmpl.content.c_str());
         }
-
       } break;
       case Token::Kind::Id: {
         get_peek_token();
 
         // Data Literal
-        if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") || tok.text == static_cast<decltype(tok.text)>("null")) {
+        if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") ||
+            tok.text == static_cast<decltype(tok.text)>("null")) {
           if (current_brace_level == 0 && current_bracket_level == 0) {
             literal_start = tok.text;
             add_literal(tmpl.content.c_str());
           }
 
-	      // Operator
+          // Operator
         } else if (tok.text == "and" || tok.text == "or" || tok.text == "in" || tok.text == "not") {
           goto parse_operator;
 
-        // Functions
+          // Functions
         } else if (peek_tok.kind == Token::Kind::LeftParen) {
           operator_stack.emplace(std::make_shared<FunctionNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
-          function_stack.emplace(operator_stack.top().get(), current_paren_level);       
+          function_stack.emplace(operator_stack.top().get(), current_paren_level);
 
-        // Variables
+          // Variables
         } else {
           arguments.emplace_back(std::make_shared<DataNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
         }
 
-      // Operators
+        // Operators
       } break;
       case Token::Kind::Equal:
       case Token::Kind::NotEqual:
@@ -231,7 +224,7 @@
       case Token::Kind::Percent:
       case Token::Kind::Dot: {
 
-  parse_operator:
+      parse_operator:
         FunctionStorage::Operation operation;
         switch (tok.kind) {
         case Token::Kind::Id: {
@@ -292,12 +285,14 @@
         }
         auto function_node = std::make_shared<FunctionNode>(operation, tok.text.data() - tmpl.content.c_str());
 
-        while (!operator_stack.empty() && ((operator_stack.top()->precedence > function_node->precedence) || (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) && (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
+        while (!operator_stack.empty() &&
+               ((operator_stack.top()->precedence > function_node->precedence) ||
+                (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) &&
+               (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
           add_operator();
         }
 
         operator_stack.emplace(function_node);
-
       } break;
       case Token::Kind::Comma: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
@@ -307,13 +302,11 @@
 
           function_stack.top().first->number_args += 1;
         }
-
       } break;
       case Token::Kind::Colon: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
           throw_parser_error("unexpected ':'");
         }
-
       } break;
       case Token::Kind::LeftParen: {
         current_paren_level += 1;
@@ -325,7 +318,6 @@
             function_stack.top().first->number_args = 0;
           }
         }
-
       } break;
       case Token::Kind::RightParen: {
         current_paren_level -= 1;
@@ -370,15 +362,14 @@
     if (arguments.size() == 1) {
       current_expression_list->root = arguments[0];
       arguments = {};
-
     } else if (arguments.size() > 1) {
       throw_parser_error("malformed expression");
     }
-    
+
     return true;
   }
 
-  bool parse_statement(Template &tmpl, Token::Kind closing, std::string_view path) {
+  bool parse_statement(Template& tmpl, Token::Kind closing, std::string_view path) {
     if (tok.kind != Token::Kind::Id) {
       return false;
     }
@@ -395,12 +386,11 @@
       if (!parse_expression(tmpl, closing)) {
         return false;
       }
-
     } else if (tok.text == static_cast<decltype(tok.text)>("else")) {
       if (if_statement_stack.empty()) {
         throw_parser_error("else without matching if");
       }
-      auto &if_statement_data = if_statement_stack.top();
+      auto& if_statement_data = if_statement_stack.top();
       get_next_token();
 
       if_statement_data->has_false_statement = true;
@@ -420,7 +410,6 @@
           return false;
         }
       }
-
     } else if (tok.text == static_cast<decltype(tok.text)>("endif")) {
       if (if_statement_stack.empty()) {
         throw_parser_error("endif without matching if");
@@ -431,12 +420,11 @@
         if_statement_stack.pop();
       }
 
-      auto &if_statement_data = if_statement_stack.top();
+      auto& if_statement_data = if_statement_stack.top();
       get_next_token();
 
       current_block = if_statement_data->parent;
       if_statement_stack.pop();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("block")) {
       get_next_token();
 
@@ -456,18 +444,16 @@
       }
 
       get_next_token();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("endblock")) {
       if (block_statement_stack.empty()) {
         throw_parser_error("endblock without matching block");
       }
 
-      auto &block_statement_data = block_statement_stack.top();
+      auto& block_statement_data = block_statement_stack.top();
       get_next_token();
 
       current_block = block_statement_data->parent;
       block_statement_stack.pop();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("for")) {
       get_next_token();
 
@@ -491,11 +477,13 @@
         value_token = tok;
         get_next_token();
 
-        for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+        for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text),
+                                                                      current_block, tok.text.data() - tmpl.content.c_str());
 
-      // Array type
+        // Array type
       } else {
-        for_statement_node = std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+        for_statement_node =
+            std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
       }
 
       current_block->nodes.emplace_back(for_statement_node);
@@ -511,18 +499,16 @@
       if (!parse_expression(tmpl, closing)) {
         return false;
       }
-
     } else if (tok.text == static_cast<decltype(tok.text)>("endfor")) {
       if (for_statement_stack.empty()) {
         throw_parser_error("endfor without matching for");
       }
 
-      auto &for_statement_data = for_statement_stack.top();
+      auto& for_statement_data = for_statement_stack.top();
       get_next_token();
 
       current_block = for_statement_data->parent;
       for_statement_stack.pop();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("include")) {
       get_next_token();
 
@@ -532,7 +518,6 @@
       current_block->nodes.emplace_back(std::make_shared<IncludeStatementNode>(template_name, tok.text.data() - tmpl.content.c_str()));
 
       get_next_token();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("extends")) {
       get_next_token();
 
@@ -542,7 +527,6 @@
       current_block->nodes.emplace_back(std::make_shared<ExtendsStatementNode>(template_name, tok.text.data() - tmpl.content.c_str()));
 
       get_next_token();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("set")) {
       get_next_token();
 
@@ -565,14 +549,13 @@
       if (!parse_expression(tmpl, closing)) {
         return false;
       }
-
     } else {
       return false;
     }
     return true;
   }
 
-  void parse_into(Template &tmpl, std::string_view path) {
+  void parse_into(Template& tmpl, std::string_view path) {
     lexer.start(tmpl.content);
     current_block = &tmpl.root;
 
@@ -586,7 +569,8 @@
         if (!for_statement_stack.empty()) {
           throw_parser_error("unmatched for");
         }
-      } return;
+      }
+        return;
       case Token::Kind::Text: {
         current_block->nodes.emplace_back(std::make_shared<TextNode>(tok.text.data() - tmpl.content.c_str(), tok.text.size()));
       } break;
@@ -636,11 +620,10 @@
     }
   }
 
-
 public:
-  explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config,
-                  TemplateStorage& template_storage, const FunctionStorage& function_storage)
-      : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) { }
+  explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config, TemplateStorage& template_storage,
+                  const FunctionStorage& function_storage)
+      : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) {}
 
   Template parse(std::string_view input, std::string_view path) {
     auto result = Template(static_cast<std::string>(input));
diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp
index 67dc09d..f24bb91 100644
--- a/include/inja/renderer.hpp
+++ b/include/inja/renderer.hpp
@@ -18,7 +18,7 @@
 /*!
  * \brief Class for rendering a Template with data.
  */
-class Renderer : public NodeVisitor  {
+class Renderer : public NodeVisitor {
   using Op = FunctionStorage::Operation;
 
   const RenderConfig config;
@@ -104,8 +104,7 @@
     data_eval_stack.push(result_ptr.get());
   }
 
-  template<size_t N, size_t N_start = 0, bool throw_not_found=true>
-  std::array<const json*, N> get_arguments(const FunctionNode& node) {
+  template <size_t N, size_t N_start = 0, bool throw_not_found = true> std::array<const json*, N> get_arguments(const FunctionNode& node) {
     if (node.arguments.size() < N_start + N) {
       throw_renderer_error("function needs " + std::to_string(N_start + N) + " variables, but has only found " + std::to_string(node.arguments.size()), node);
     }
@@ -135,10 +134,9 @@
     return result;
   }
 
-  template<bool throw_not_found=true>
-  Arguments get_argument_vector(const FunctionNode& node) {
+  template <bool throw_not_found = true> Arguments get_argument_vector(const FunctionNode& node) {
     const size_t N = node.arguments.size();
-    for (auto a: node.arguments) {
+    for (auto a : node.arguments) {
       a->accept(*this);
     }
 
@@ -177,7 +175,7 @@
     output_stream->write(current_template->content.c_str() + node.pos, node.length);
   }
 
-  void visit(const ExpressionNode&) { }
+  void visit(const ExpressionNode&) {}
 
   void visit(const LiteralNode& node) {
     data_eval_stack.push(&node.value);
@@ -186,10 +184,8 @@
   void visit(const DataNode& node) {
     if (additional_data.contains(node.ptr)) {
       data_eval_stack.push(&(additional_data[node.ptr]));
-
     } else if (data_input->contains(node.ptr)) {
       data_eval_stack.push(&(*data_input)[node.ptr]);
-
     } else {
       // Try to evaluate as a no-argument callback
       const auto function_data = function_storage.find_function(node.name, 0);
@@ -198,7 +194,6 @@
         const auto value = std::make_shared<json>(function_data.callback(empty_args));
         data_tmp_stack.push_back(value);
         data_eval_stack.push(value.get());
-
       } else {
         data_eval_stack.push(nullptr);
         not_found_stack.emplace(&node);
@@ -325,12 +320,12 @@
       make_result(get_arguments<1>(node)[0]->get<int>() % 2 == 0);
     } break;
     case Op::Exists: {
-      auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
+      auto&& name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
       make_result(data_input->contains(json::json_pointer(DataNode::convert_dot_to_ptr(name))));
     } break;
     case Op::ExistsInObject: {
       const auto args = get_arguments<2>(node);
-      auto &&name = args[1]->get_ref<const std::string&>();
+      auto&& name = args[1]->get_ref<const std::string&>();
       make_result(args[0]->find(name) != args[0]->end());
     } break;
     case Op::First: {
@@ -480,9 +475,9 @@
     print_data(eval_expression_list(node));
   }
 
-  void visit(const StatementNode&) { }
+  void visit(const StatementNode&) {}
 
-  void visit(const ForStatementNode&) { }
+  void visit(const ForStatementNode&) {}
 
   void visit(const ForArrayStatementNode& node) {
     const auto result = eval_expression_list(node.condition);
@@ -584,7 +579,7 @@
   void visit(const ExtendsStatementNode& node) {
     const auto included_template_it = template_storage.find(node.file);
     if (included_template_it != template_storage.end()) {
-      const Template *parent_template = &included_template_it->second;
+      const Template* parent_template = &included_template_it->second;
       render_to(*output_stream, *parent_template, *data_input, &additional_data);
       break_rendering = true;
     } else if (config.throw_at_missing_includes) {
@@ -600,7 +595,7 @@
     if (block_it != current_template->block_storage.end()) {
       block_statement_stack.emplace_back(&node);
       block_it->second->block.accept(*this);
-      block_statement_stack.pop_back(); 
+      block_statement_stack.pop_back();
     }
     current_level = old_level;
     current_template = template_stack.back();
@@ -615,7 +610,7 @@
 
 public:
   Renderer(const RenderConfig& config, const TemplateStorage& template_storage, const FunctionStorage& function_storage)
-      : config(config), template_storage(template_storage), function_storage(function_storage) { }
+      : config(config), template_storage(template_storage), function_storage(function_storage) {}
 
   void render_to(std::ostream& os, const Template& tmpl, const json& data, json* loop_data = nullptr) {
     output_stream = &os;
diff --git a/include/inja/statistics.hpp b/include/inja/statistics.hpp
index f9b3f88..da33593 100644
--- a/include/inja/statistics.hpp
+++ b/include/inja/statistics.hpp
@@ -3,7 +3,6 @@
 
 #include "node.hpp"
 
-
 namespace inja {
 
 /*!
@@ -16,9 +15,9 @@
     }
   }
 
-  void visit(const TextNode&) { }
-  void visit(const ExpressionNode&) { }
-  void visit(const LiteralNode&) { }
+  void visit(const TextNode&) {}
+  void visit(const ExpressionNode&) {}
+  void visit(const LiteralNode&) {}
 
   void visit(const DataNode&) {
     variable_counter += 1;
@@ -34,8 +33,8 @@
     node.root->accept(*this);
   }
 
-  void visit(const StatementNode&) { }
-  void visit(const ForStatementNode&) { }
+  void visit(const StatementNode&) {}
+  void visit(const ForStatementNode&) {}
 
   void visit(const ForArrayStatementNode& node) {
     node.condition.accept(*this);
@@ -53,20 +52,20 @@
     node.false_statement.accept(*this);
   }
 
-  void visit(const IncludeStatementNode&) { }
+  void visit(const IncludeStatementNode&) {}
 
-  void visit(const ExtendsStatementNode&) { }
+  void visit(const ExtendsStatementNode&) {}
 
   void visit(const BlockStatementNode& node) {
     node.block.accept(*this);
   }
 
-  void visit(const SetStatementNode&) { }
+  void visit(const SetStatementNode&) {}
 
 public:
   unsigned int variable_counter;
 
-  explicit StatisticsVisitor() : variable_counter(0) { }
+  explicit StatisticsVisitor(): variable_counter(0) {}
 };
 
 } // namespace inja
diff --git a/include/inja/template.hpp b/include/inja/template.hpp
index 45b276b..a396dd5 100644
--- a/include/inja/template.hpp
+++ b/include/inja/template.hpp
@@ -9,7 +9,6 @@
 #include "node.hpp"
 #include "statistics.hpp"
 
-
 namespace inja {
 
 /*!
@@ -20,8 +19,8 @@
   std::string content;
   std::map<std::string, std::shared_ptr<BlockStatementNode>> block_storage;
 
-  explicit Template() { }
-  explicit Template(const std::string& content): content(content) { }
+  explicit Template() {}
+  explicit Template(const std::string& content): content(content) {}
 
   /// Return number of variables (total number, not distinct ones) in the template
   int count_variables() {
diff --git a/include/inja/token.hpp b/include/inja/token.hpp
index 5391342..207e78e 100644
--- a/include/inja/token.hpp
+++ b/include/inja/token.hpp
@@ -4,7 +4,6 @@
 #include <string>
 #include <string_view>
 
-
 namespace inja {
 
 /*!
@@ -48,12 +47,12 @@
     Unknown,
     Eof,
   };
-  
+
   Kind kind {Kind::Unknown};
   std::string_view text;
 
   explicit constexpr Token() = default;
-  explicit constexpr Token(Kind kind, std::string_view text) : kind(kind), text(text) {}
+  explicit constexpr Token(Kind kind, std::string_view text): kind(kind), text(text) {}
 
   std::string describe() const {
     switch (kind) {
diff --git a/include/inja/utils.hpp b/include/inja/utils.hpp
index c1d13d5..4de05fd 100644
--- a/include/inja/utils.hpp
+++ b/include/inja/utils.hpp
@@ -9,7 +9,6 @@
 
 #include "exceptions.hpp"
 
-
 namespace inja {
 
 namespace string_view {
@@ -55,14 +54,14 @@
   return {count_lines + 1, sliced.length() - last_newline};
 }
 
-inline void replace_substring(std::string& s, const std::string& f,
-                              const std::string& t)
-{
-  if (f.empty()) return;
-  for (auto pos = s.find(f);                  // find first occurrence of f
-            pos != std::string::npos;         // make sure f was found
-            s.replace(pos, f.size(), t),      // replace with t, and
-            pos = s.find(f, pos + t.size()))  // find next occurrence of f
+inline void replace_substring(std::string& s, const std::string& f, const std::string& t) {
+  if (f.empty()) {
+    return;
+  }
+  for (auto pos = s.find(f);            // find first occurrence of f
+       pos != std::string::npos;        // make sure f was found
+       s.replace(pos, f.size(), t),     // replace with t, and
+       pos = s.find(f, pos + t.size())) // find next occurrence of f
   {}
 }
 
diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp
index 0273fd4..6aad870 100644
--- a/single_include/inja/inja.hpp
+++ b/single_include/inja/inja.hpp
@@ -4,7 +4,7 @@
   | || '_ \ | |/ _` |   Licensed under the MIT License <http://opensource.org/licenses/MIT>.
   | || | | || | (_| |
  |___|_| |_|/ |\__,_|   Copyright (c) 2018-2021 Lars Berscheid
-          |__/       
+          |__/
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
 in the Software without restriction, including without limitation the rights
@@ -29,24 +29,26 @@
 
 namespace inja {
 #ifndef INJA_DATA_TYPE
-  using json = nlohmann::json;
+using json = nlohmann::json;
 #else
-  using json = INJA_DATA_TYPE;
+using json = INJA_DATA_TYPE;
 #endif
-}
+} // namespace inja
 
 #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(INJA_NOEXCEPTION)
-  #ifndef INJA_THROW
-    #define INJA_THROW(exception) throw exception
-  #endif
+#ifndef INJA_THROW
+#define INJA_THROW(exception) throw exception
+#endif
 #else
-  #include <cstdlib>
-  #ifndef INJA_THROW
-    #define INJA_THROW(exception) std::abort(); std::ignore = exception
-  #endif
-  #ifndef INJA_NOEXCEPTION
-    #define INJA_NOEXCEPTION
-  #endif
+#include <cstdlib>
+#ifndef INJA_THROW
+#define INJA_THROW(exception)                                                                                                                                  \
+  std::abort();                                                                                                                                                \
+  std::ignore = exception
+#endif
+#ifndef INJA_NOEXCEPTION
+#define INJA_NOEXCEPTION
+#endif
 #endif
 
 // #include "environment.hpp"
@@ -91,7 +93,6 @@
 #include <string_view>
 #include <vector>
 
-
 namespace inja {
 
 using Arguments = std::vector<const json*>;
@@ -156,7 +157,7 @@
   };
 
   struct FunctionData {
-    explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction{}) : operation(op), callback(cb) {}
+    explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
     const Operation operation;
     const CallbackFunction callback;
   };
@@ -165,44 +166,44 @@
   const int VARIADIC {-1};
 
   std::map<std::pair<std::string, int>, FunctionData> function_storage = {
-    {std::make_pair("at", 2), FunctionData { Operation::At }},
-    {std::make_pair("default", 2), FunctionData { Operation::Default }},
-    {std::make_pair("divisibleBy", 2), FunctionData { Operation::DivisibleBy }},
-    {std::make_pair("even", 1), FunctionData { Operation::Even }},
-    {std::make_pair("exists", 1), FunctionData { Operation::Exists }},
-    {std::make_pair("existsIn", 2), FunctionData { Operation::ExistsInObject }},
-    {std::make_pair("first", 1), FunctionData { Operation::First }},
-    {std::make_pair("float", 1), FunctionData { Operation::Float }},
-    {std::make_pair("int", 1), FunctionData { Operation::Int }},
-    {std::make_pair("isArray", 1), FunctionData { Operation::IsArray }},
-    {std::make_pair("isBoolean", 1), FunctionData { Operation::IsBoolean }},
-    {std::make_pair("isFloat", 1), FunctionData { Operation::IsFloat }},
-    {std::make_pair("isInteger", 1), FunctionData { Operation::IsInteger }},
-    {std::make_pair("isNumber", 1), FunctionData { Operation::IsNumber }},
-    {std::make_pair("isObject", 1), FunctionData { Operation::IsObject }},
-    {std::make_pair("isString", 1), FunctionData { Operation::IsString }},
-    {std::make_pair("last", 1), FunctionData { Operation::Last }},
-    {std::make_pair("length", 1), FunctionData { Operation::Length }},
-    {std::make_pair("lower", 1), FunctionData { Operation::Lower }},
-    {std::make_pair("max", 1), FunctionData { Operation::Max }},
-    {std::make_pair("min", 1), FunctionData { Operation::Min }},
-    {std::make_pair("odd", 1), FunctionData { Operation::Odd }},
-    {std::make_pair("range", 1), FunctionData { Operation::Range }},
-    {std::make_pair("round", 2), FunctionData { Operation::Round }},
-    {std::make_pair("sort", 1), FunctionData { Operation::Sort }},
-    {std::make_pair("upper", 1), FunctionData { Operation::Upper }},
-    {std::make_pair("super", 0), FunctionData { Operation::Super }},
-    {std::make_pair("super", 1), FunctionData { Operation::Super }},
-    {std::make_pair("join", 2), FunctionData { Operation::Join }},
+      {std::make_pair("at", 2), FunctionData {Operation::At}},
+      {std::make_pair("default", 2), FunctionData {Operation::Default}},
+      {std::make_pair("divisibleBy", 2), FunctionData {Operation::DivisibleBy}},
+      {std::make_pair("even", 1), FunctionData {Operation::Even}},
+      {std::make_pair("exists", 1), FunctionData {Operation::Exists}},
+      {std::make_pair("existsIn", 2), FunctionData {Operation::ExistsInObject}},
+      {std::make_pair("first", 1), FunctionData {Operation::First}},
+      {std::make_pair("float", 1), FunctionData {Operation::Float}},
+      {std::make_pair("int", 1), FunctionData {Operation::Int}},
+      {std::make_pair("isArray", 1), FunctionData {Operation::IsArray}},
+      {std::make_pair("isBoolean", 1), FunctionData {Operation::IsBoolean}},
+      {std::make_pair("isFloat", 1), FunctionData {Operation::IsFloat}},
+      {std::make_pair("isInteger", 1), FunctionData {Operation::IsInteger}},
+      {std::make_pair("isNumber", 1), FunctionData {Operation::IsNumber}},
+      {std::make_pair("isObject", 1), FunctionData {Operation::IsObject}},
+      {std::make_pair("isString", 1), FunctionData {Operation::IsString}},
+      {std::make_pair("last", 1), FunctionData {Operation::Last}},
+      {std::make_pair("length", 1), FunctionData {Operation::Length}},
+      {std::make_pair("lower", 1), FunctionData {Operation::Lower}},
+      {std::make_pair("max", 1), FunctionData {Operation::Max}},
+      {std::make_pair("min", 1), FunctionData {Operation::Min}},
+      {std::make_pair("odd", 1), FunctionData {Operation::Odd}},
+      {std::make_pair("range", 1), FunctionData {Operation::Range}},
+      {std::make_pair("round", 2), FunctionData {Operation::Round}},
+      {std::make_pair("sort", 1), FunctionData {Operation::Sort}},
+      {std::make_pair("upper", 1), FunctionData {Operation::Upper}},
+      {std::make_pair("super", 0), FunctionData {Operation::Super}},
+      {std::make_pair("super", 1), FunctionData {Operation::Super}},
+      {std::make_pair("join", 2), FunctionData {Operation::Join}},
   };
 
 public:
   void add_builtin(std::string_view name, int num_args, Operation op) {
-    function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { op });
+    function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {op});
   }
 
   void add_callback(std::string_view name, int num_args, const CallbackFunction& callback) {
-    function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData { Operation::Callback, callback });
+    function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {Operation::Callback, callback});
   }
 
   FunctionData find_function(std::string_view name, int num_args) const {
@@ -210,7 +211,7 @@
     if (it != function_storage.end()) {
       return it->second;
 
-    // Find variadic function
+      // Find variadic function
     } else if (num_args > 0) {
       it = function_storage.find(std::make_pair(static_cast<std::string>(name), VARIADIC));
       if (it != function_storage.end()) {
@@ -218,7 +219,7 @@
       }
     }
 
-    return FunctionData { Operation::None };
+    return FunctionData {Operation::None};
   }
 };
 
@@ -256,30 +257,29 @@
 
   const SourceLocation location;
 
-  explicit InjaError(const std::string &type, const std::string &message)
+  explicit InjaError(const std::string& type, const std::string& message)
       : std::runtime_error("[inja.exception." + type + "] " + message), type(type), message(message), location({0, 0}) {}
 
-  explicit InjaError(const std::string &type, const std::string &message, SourceLocation location)
-      : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" +
-                           std::to_string(location.column) + ") " + message),
+  explicit InjaError(const std::string& type, const std::string& message, SourceLocation location)
+      : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" + std::to_string(location.column) + ") " + message),
         type(type), message(message), location(location) {}
 };
 
 struct ParserError : public InjaError {
-  explicit ParserError(const std::string &message, SourceLocation location) : InjaError("parser_error", message, location) {}
+  explicit ParserError(const std::string& message, SourceLocation location): InjaError("parser_error", message, location) {}
 };
 
 struct RenderError : public InjaError {
-  explicit RenderError(const std::string &message, SourceLocation location) : InjaError("render_error", message, location) {}
+  explicit RenderError(const std::string& message, SourceLocation location): InjaError("render_error", message, location) {}
 };
 
 struct FileError : public InjaError {
-  explicit FileError(const std::string &message) : InjaError("file_error", message) {}
-  explicit FileError(const std::string &message, SourceLocation location) : InjaError("file_error", message, location) {}
+  explicit FileError(const std::string& message): InjaError("file_error", message) {}
+  explicit FileError(const std::string& message, SourceLocation location): InjaError("file_error", message, location) {}
 };
 
 struct DataError : public InjaError {
-  explicit DataError(const std::string &message, SourceLocation location) : InjaError("data_error", message, location) {}
+  explicit DataError(const std::string& message, SourceLocation location): InjaError("data_error", message, location) {}
 };
 
 } // namespace inja
@@ -287,7 +287,6 @@
 #endif // INCLUDE_INJA_EXCEPTIONS_HPP_
 
 
-
 namespace inja {
 
 namespace string_view {
@@ -333,14 +332,14 @@
   return {count_lines + 1, sliced.length() - last_newline};
 }
 
-inline void replace_substring(std::string& s, const std::string& f,
-                              const std::string& t)
-{
-  if (f.empty()) return;
-  for (auto pos = s.find(f);                  // find first occurrence of f
-            pos != std::string::npos;         // make sure f was found
-            s.replace(pos, f.size(), t),      // replace with t, and
-            pos = s.find(f, pos + t.size()))  // find next occurrence of f
+inline void replace_substring(std::string& s, const std::string& f, const std::string& t) {
+  if (f.empty()) {
+    return;
+  }
+  for (auto pos = s.find(f);            // find first occurrence of f
+       pos != std::string::npos;        // make sure f was found
+       s.replace(pos, f.size(), t),     // replace with t, and
+       pos = s.find(f, pos + t.size())) // find next occurrence of f
   {}
 }
 
@@ -349,7 +348,6 @@
 #endif // INCLUDE_INJA_UTILS_HPP_
 
 
-
 namespace inja {
 
 class NodeVisitor;
@@ -370,7 +368,6 @@
 class BlockStatementNode;
 class SetStatementNode;
 
-
 class NodeVisitor {
 public:
   virtual ~NodeVisitor() = default;
@@ -402,16 +399,15 @@
 
   size_t pos;
 
-  AstNode(size_t pos) : pos(pos) { }
-  virtual ~AstNode() { }
+  AstNode(size_t pos): pos(pos) {}
+  virtual ~AstNode() {}
 };
 
-
 class BlockNode : public AstNode {
 public:
   std::vector<std::shared_ptr<AstNode>> nodes;
 
-  explicit BlockNode() : AstNode(0) {}
+  explicit BlockNode(): AstNode(0) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -422,7 +418,7 @@
 public:
   const size_t length;
 
-  explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) { }
+  explicit TextNode(size_t pos, size_t length): AstNode(pos), length(length) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -431,7 +427,7 @@
 
 class ExpressionNode : public AstNode {
 public:
-  explicit ExpressionNode(size_t pos) : AstNode(pos) {}
+  explicit ExpressionNode(size_t pos): AstNode(pos) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -442,7 +438,7 @@
 public:
   const json value;
 
-  explicit LiteralNode(std::string_view data_text, size_t pos) : ExpressionNode(pos), value(json::parse(data_text)) { }
+  explicit LiteralNode(std::string_view data_text, size_t pos): ExpressionNode(pos), value(json::parse(data_text)) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -465,7 +461,7 @@
     return result;
   }
 
-  explicit DataNode(std::string_view ptr_name, size_t pos) : ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) { }
+  explicit DataNode(std::string_view ptr_name, size_t pos): ExpressionNode(pos), name(ptr_name), ptr(json::json_pointer(convert_dot_to_ptr(ptr_name))) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -491,98 +487,99 @@
   std::vector<std::shared_ptr<ExpressionNode>> arguments;
   CallbackFunction callback;
 
-  explicit FunctionNode(std::string_view name, size_t pos) : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) { }
-  explicit FunctionNode(Op operation, size_t pos) : ExpressionNode(pos), operation(operation), number_args(1) {
+  explicit FunctionNode(std::string_view name, size_t pos)
+      : ExpressionNode(pos), precedence(8), associativity(Associativity::Left), operation(Op::Callback), name(name), number_args(1) {}
+  explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos), operation(operation), number_args(1) {
     switch (operation) {
-      case Op::Not: {
-        number_args = 1;
-        precedence = 4;
-        associativity = Associativity::Left;
-      } break;
-      case Op::And: {
-        number_args = 2;
-        precedence = 1;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Or: {
-        number_args = 2;
-        precedence = 1;
-        associativity = Associativity::Left;
-      } break;
-      case Op::In: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Equal: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::NotEqual: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Greater: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::GreaterEqual: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Less: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::LessEqual: {
-        number_args = 2;
-        precedence = 2;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Add: {
-        number_args = 2;
-        precedence = 3;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Subtract: {
-        number_args = 2;
-        precedence = 3;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Multiplication: {
-        number_args = 2;
-        precedence = 4;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Division: {
-        number_args = 2;
-        precedence = 4;
-        associativity = Associativity::Left;
-      } break;
-      case Op::Power: {
-        number_args = 2;
-        precedence = 5;
-        associativity = Associativity::Right;
-      } break;
-      case Op::Modulo: {
-        number_args = 2;
-        precedence = 4;
-        associativity = Associativity::Left;
-      } break;
-      case Op::AtId: {
-        number_args = 2;
-        precedence = 8;
-        associativity = Associativity::Left;
-      } break;
-      default: {
-        precedence = 1;
-        associativity = Associativity::Left;
-      }
+    case Op::Not: {
+      number_args = 1;
+      precedence = 4;
+      associativity = Associativity::Left;
+    } break;
+    case Op::And: {
+      number_args = 2;
+      precedence = 1;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Or: {
+      number_args = 2;
+      precedence = 1;
+      associativity = Associativity::Left;
+    } break;
+    case Op::In: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Equal: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::NotEqual: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Greater: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::GreaterEqual: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Less: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::LessEqual: {
+      number_args = 2;
+      precedence = 2;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Add: {
+      number_args = 2;
+      precedence = 3;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Subtract: {
+      number_args = 2;
+      precedence = 3;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Multiplication: {
+      number_args = 2;
+      precedence = 4;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Division: {
+      number_args = 2;
+      precedence = 4;
+      associativity = Associativity::Left;
+    } break;
+    case Op::Power: {
+      number_args = 2;
+      precedence = 5;
+      associativity = Associativity::Right;
+    } break;
+    case Op::Modulo: {
+      number_args = 2;
+      precedence = 4;
+      associativity = Associativity::Left;
+    } break;
+    case Op::AtId: {
+      number_args = 2;
+      precedence = 8;
+      associativity = Associativity::Left;
+    } break;
+    default: {
+      precedence = 1;
+      associativity = Associativity::Left;
+    }
     }
   }
 
@@ -595,8 +592,8 @@
 public:
   std::shared_ptr<ExpressionNode> root;
 
-  explicit ExpressionListNode() : AstNode(0) { }
-  explicit ExpressionListNode(size_t pos) : AstNode(pos) { }
+  explicit ExpressionListNode(): AstNode(0) {}
+  explicit ExpressionListNode(size_t pos): AstNode(pos) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -605,7 +602,7 @@
 
 class StatementNode : public AstNode {
 public:
-  StatementNode(size_t pos) : AstNode(pos) { }
+  StatementNode(size_t pos): AstNode(pos) {}
 
   virtual void accept(NodeVisitor& v) const = 0;
 };
@@ -614,9 +611,9 @@
 public:
   ExpressionListNode condition;
   BlockNode body;
-  BlockNode *const parent;
+  BlockNode* const parent;
 
-  ForStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent) { }
+  ForStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent) {}
 
   virtual void accept(NodeVisitor& v) const = 0;
 };
@@ -625,7 +622,7 @@
 public:
   const std::string value;
 
-  explicit ForArrayStatementNode(const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), value(value) { }
+  explicit ForArrayStatementNode(const std::string& value, BlockNode* const parent, size_t pos): ForStatementNode(parent, pos), value(value) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -637,7 +634,8 @@
   const std::string key;
   const std::string value;
 
-  explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode *const parent, size_t pos) : ForStatementNode(parent, pos), key(key), value(value) { }
+  explicit ForObjectStatementNode(const std::string& key, const std::string& value, BlockNode* const parent, size_t pos)
+      : ForStatementNode(parent, pos), key(key), value(value) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -649,13 +647,13 @@
   ExpressionListNode condition;
   BlockNode true_statement;
   BlockNode false_statement;
-  BlockNode *const parent;
+  BlockNode* const parent;
 
   const bool is_nested;
   bool has_false_statement {false};
 
-  explicit IfStatementNode(BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(false) { }
-  explicit IfStatementNode(bool is_nested, BlockNode *const parent, size_t pos) : StatementNode(pos), parent(parent), is_nested(is_nested) { }
+  explicit IfStatementNode(BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(false) {}
+  explicit IfStatementNode(bool is_nested, BlockNode* const parent, size_t pos): StatementNode(pos), parent(parent), is_nested(is_nested) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -666,7 +664,7 @@
 public:
   const std::string file;
 
-  explicit IncludeStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+  explicit IncludeStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -677,7 +675,7 @@
 public:
   const std::string file;
 
-  explicit ExtendsStatementNode(const std::string& file, size_t pos) : StatementNode(pos), file(file) { }
+  explicit ExtendsStatementNode(const std::string& file, size_t pos): StatementNode(pos), file(file) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -688,9 +686,9 @@
 public:
   const std::string name;
   BlockNode block;
-  BlockNode *const parent;
+  BlockNode* const parent;
 
-  explicit BlockStatementNode(BlockNode *const parent, const std::string& name, size_t pos) : StatementNode(pos), name(name), parent(parent) { }
+  explicit BlockStatementNode(BlockNode* const parent, const std::string& name, size_t pos): StatementNode(pos), name(name), parent(parent) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -702,7 +700,7 @@
   const std::string key;
   ExpressionListNode expression;
 
-  explicit SetStatementNode(const std::string& key, size_t pos) : StatementNode(pos), key(key) { }
+  explicit SetStatementNode(const std::string& key, size_t pos): StatementNode(pos), key(key) {}
 
   void accept(NodeVisitor& v) const {
     v.visit(*this);
@@ -720,7 +718,6 @@
 // #include "node.hpp"
 
 
-
 namespace inja {
 
 /*!
@@ -733,9 +730,9 @@
     }
   }
 
-  void visit(const TextNode&) { }
-  void visit(const ExpressionNode&) { }
-  void visit(const LiteralNode&) { }
+  void visit(const TextNode&) {}
+  void visit(const ExpressionNode&) {}
+  void visit(const LiteralNode&) {}
 
   void visit(const DataNode&) {
     variable_counter += 1;
@@ -751,8 +748,8 @@
     node.root->accept(*this);
   }
 
-  void visit(const StatementNode&) { }
-  void visit(const ForStatementNode&) { }
+  void visit(const StatementNode&) {}
+  void visit(const ForStatementNode&) {}
 
   void visit(const ForArrayStatementNode& node) {
     node.condition.accept(*this);
@@ -770,20 +767,20 @@
     node.false_statement.accept(*this);
   }
 
-  void visit(const IncludeStatementNode&) { }
+  void visit(const IncludeStatementNode&) {}
 
-  void visit(const ExtendsStatementNode&) { }
+  void visit(const ExtendsStatementNode&) {}
 
   void visit(const BlockStatementNode& node) {
     node.block.accept(*this);
   }
 
-  void visit(const SetStatementNode&) { }
+  void visit(const SetStatementNode&) {}
 
 public:
   unsigned int variable_counter;
 
-  explicit StatisticsVisitor() : variable_counter(0) { }
+  explicit StatisticsVisitor(): variable_counter(0) {}
 };
 
 } // namespace inja
@@ -791,7 +788,6 @@
 #endif // INCLUDE_INJA_STATISTICS_HPP_
 
 
-
 namespace inja {
 
 /*!
@@ -802,8 +798,8 @@
   std::string content;
   std::map<std::string, std::shared_ptr<BlockStatementNode>> block_storage;
 
-  explicit Template() { }
-  explicit Template(const std::string& content): content(content) { }
+  explicit Template() {}
+  explicit Template(const std::string& content): content(content) {}
 
   /// Return number of variables (total number, not distinct ones) in the template
   int count_variables() {
@@ -928,7 +924,6 @@
 #include <string>
 #include <string_view>
 
-
 namespace inja {
 
 /*!
@@ -972,12 +967,12 @@
     Unknown,
     Eof,
   };
-  
+
   Kind kind {Kind::Unknown};
   std::string_view text;
 
   explicit constexpr Token() = default;
-  explicit constexpr Token(Kind kind, std::string_view text) : kind(kind), text(text) {}
+  explicit constexpr Token(Kind kind, std::string_view text): kind(kind), text(text) {}
 
   std::string describe() const {
     switch (kind) {
@@ -1035,7 +1030,6 @@
   size_t tok_start;
   size_t pos;
 
-
   Token scan_body(std::string_view close, Token::Kind closeKind, std::string_view close_trim = std::string_view(), bool trim = false) {
   again:
     // skip whitespace (except for \n as it might be a close)
@@ -1216,7 +1210,9 @@
     return make_token(Token::Kind::String);
   }
 
-  Token make_token(Token::Kind kind) const { return Token(kind, string_view::slice(m_in, tok_start, pos)); }
+  Token make_token(Token::Kind kind) const {
+    return Token(kind, string_view::slice(m_in, tok_start, pos));
+  }
 
   void skip_whitespaces_and_newlines() {
     if (pos < m_in.size()) {
@@ -1262,7 +1258,7 @@
   }
 
 public:
-  explicit Lexer(const LexerConfig& config) : config(config), state(State::Text), minus_state(MinusState::Number) {}
+  explicit Lexer(const LexerConfig& config): config(config), state(State::Text), minus_state(MinusState::Number) {}
 
   SourceLocation current_position() const {
     return get_source_location(m_in, tok_start);
@@ -1314,7 +1310,7 @@
       } else if (inja::string_view::starts_with(open_str, config.statement_open)) {
         if (inja::string_view::starts_with(open_str, config.statement_open_no_lstrip)) {
           state = State::StatementStartNoLstrip;
-        } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip )) {
+        } else if (inja::string_view::starts_with(open_str, config.statement_open_force_lstrip)) {
           state = State::StatementStartForceLstrip;
           must_lstrip = true;
         } else {
@@ -1434,7 +1430,6 @@
 // #include "utils.hpp"
 
 
-
 namespace inja {
 
 /*!
@@ -1456,8 +1451,8 @@
 
   std::string_view literal_start;
 
-  BlockNode *current_block {nullptr};
-  ExpressionListNode *current_expression_list {nullptr};
+  BlockNode* current_block {nullptr};
+  ExpressionListNode* current_expression_list {nullptr};
   std::stack<std::pair<FunctionNode*, size_t>> function_stack;
   std::vector<std::shared_ptr<ExpressionNode>> arguments;
 
@@ -1528,7 +1523,6 @@
           template_storage.emplace(template_name, include_template);
           parse_into_template(template_storage[template_name], template_name);
           return;
-
         } else if (!config.include_callback) {
           INJA_THROW(FileError("failed accessing file at '" + template_name + "'"));
         }
@@ -1555,7 +1549,7 @@
     return std::string {tok.text.substr(1, tok.text.length() - 2)};
   }
 
-  bool parse_expression(Template &tmpl, Token::Kind closing) {
+  bool parse_expression(Template& tmpl, Token::Kind closing) {
     while (tok.kind != closing && tok.kind != Token::Kind::Eof) {
       // Literals
       switch (tok.kind) {
@@ -1564,28 +1558,24 @@
           literal_start = tok.text;
           add_literal(tmpl.content.c_str());
         }
-
       } break;
       case Token::Kind::Number: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
           literal_start = tok.text;
           add_literal(tmpl.content.c_str());
         }
-
       } break;
       case Token::Kind::LeftBracket: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
           literal_start = tok.text;
         }
         current_bracket_level += 1;
-
       } break;
       case Token::Kind::LeftBrace: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
           literal_start = tok.text;
         }
         current_brace_level += 1;
-
       } break;
       case Token::Kind::RightBracket: {
         if (current_bracket_level == 0) {
@@ -1596,7 +1586,6 @@
         if (current_brace_level == 0 && current_bracket_level == 0) {
           add_literal(tmpl.content.c_str());
         }
-
       } break;
       case Token::Kind::RightBrace: {
         if (current_brace_level == 0) {
@@ -1607,33 +1596,33 @@
         if (current_brace_level == 0 && current_bracket_level == 0) {
           add_literal(tmpl.content.c_str());
         }
-
       } break;
       case Token::Kind::Id: {
         get_peek_token();
 
         // Data Literal
-        if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") || tok.text == static_cast<decltype(tok.text)>("null")) {
+        if (tok.text == static_cast<decltype(tok.text)>("true") || tok.text == static_cast<decltype(tok.text)>("false") ||
+            tok.text == static_cast<decltype(tok.text)>("null")) {
           if (current_brace_level == 0 && current_bracket_level == 0) {
             literal_start = tok.text;
             add_literal(tmpl.content.c_str());
           }
 
-	      // Operator
+          // Operator
         } else if (tok.text == "and" || tok.text == "or" || tok.text == "in" || tok.text == "not") {
           goto parse_operator;
 
-        // Functions
+          // Functions
         } else if (peek_tok.kind == Token::Kind::LeftParen) {
           operator_stack.emplace(std::make_shared<FunctionNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
-          function_stack.emplace(operator_stack.top().get(), current_paren_level);       
+          function_stack.emplace(operator_stack.top().get(), current_paren_level);
 
-        // Variables
+          // Variables
         } else {
           arguments.emplace_back(std::make_shared<DataNode>(static_cast<std::string>(tok.text), tok.text.data() - tmpl.content.c_str()));
         }
 
-      // Operators
+        // Operators
       } break;
       case Token::Kind::Equal:
       case Token::Kind::NotEqual:
@@ -1649,7 +1638,7 @@
       case Token::Kind::Percent:
       case Token::Kind::Dot: {
 
-  parse_operator:
+      parse_operator:
         FunctionStorage::Operation operation;
         switch (tok.kind) {
         case Token::Kind::Id: {
@@ -1710,12 +1699,14 @@
         }
         auto function_node = std::make_shared<FunctionNode>(operation, tok.text.data() - tmpl.content.c_str());
 
-        while (!operator_stack.empty() && ((operator_stack.top()->precedence > function_node->precedence) || (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) && (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
+        while (!operator_stack.empty() &&
+               ((operator_stack.top()->precedence > function_node->precedence) ||
+                (operator_stack.top()->precedence == function_node->precedence && function_node->associativity == FunctionNode::Associativity::Left)) &&
+               (operator_stack.top()->operation != FunctionStorage::Operation::ParenLeft)) {
           add_operator();
         }
 
         operator_stack.emplace(function_node);
-
       } break;
       case Token::Kind::Comma: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
@@ -1725,13 +1716,11 @@
 
           function_stack.top().first->number_args += 1;
         }
-
       } break;
       case Token::Kind::Colon: {
         if (current_brace_level == 0 && current_bracket_level == 0) {
           throw_parser_error("unexpected ':'");
         }
-
       } break;
       case Token::Kind::LeftParen: {
         current_paren_level += 1;
@@ -1743,7 +1732,6 @@
             function_stack.top().first->number_args = 0;
           }
         }
-
       } break;
       case Token::Kind::RightParen: {
         current_paren_level -= 1;
@@ -1788,15 +1776,14 @@
     if (arguments.size() == 1) {
       current_expression_list->root = arguments[0];
       arguments = {};
-
     } else if (arguments.size() > 1) {
       throw_parser_error("malformed expression");
     }
-    
+
     return true;
   }
 
-  bool parse_statement(Template &tmpl, Token::Kind closing, std::string_view path) {
+  bool parse_statement(Template& tmpl, Token::Kind closing, std::string_view path) {
     if (tok.kind != Token::Kind::Id) {
       return false;
     }
@@ -1813,12 +1800,11 @@
       if (!parse_expression(tmpl, closing)) {
         return false;
       }
-
     } else if (tok.text == static_cast<decltype(tok.text)>("else")) {
       if (if_statement_stack.empty()) {
         throw_parser_error("else without matching if");
       }
-      auto &if_statement_data = if_statement_stack.top();
+      auto& if_statement_data = if_statement_stack.top();
       get_next_token();
 
       if_statement_data->has_false_statement = true;
@@ -1838,7 +1824,6 @@
           return false;
         }
       }
-
     } else if (tok.text == static_cast<decltype(tok.text)>("endif")) {
       if (if_statement_stack.empty()) {
         throw_parser_error("endif without matching if");
@@ -1849,12 +1834,11 @@
         if_statement_stack.pop();
       }
 
-      auto &if_statement_data = if_statement_stack.top();
+      auto& if_statement_data = if_statement_stack.top();
       get_next_token();
 
       current_block = if_statement_data->parent;
       if_statement_stack.pop();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("block")) {
       get_next_token();
 
@@ -1874,18 +1858,16 @@
       }
 
       get_next_token();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("endblock")) {
       if (block_statement_stack.empty()) {
         throw_parser_error("endblock without matching block");
       }
 
-      auto &block_statement_data = block_statement_stack.top();
+      auto& block_statement_data = block_statement_stack.top();
       get_next_token();
 
       current_block = block_statement_data->parent;
       block_statement_stack.pop();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("for")) {
       get_next_token();
 
@@ -1909,11 +1891,13 @@
         value_token = tok;
         get_next_token();
 
-        for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+        for_statement_node = std::make_shared<ForObjectStatementNode>(static_cast<std::string>(key_token.text), static_cast<std::string>(value_token.text),
+                                                                      current_block, tok.text.data() - tmpl.content.c_str());
 
-      // Array type
+        // Array type
       } else {
-        for_statement_node = std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
+        for_statement_node =
+            std::make_shared<ForArrayStatementNode>(static_cast<std::string>(value_token.text), current_block, tok.text.data() - tmpl.content.c_str());
       }
 
       current_block->nodes.emplace_back(for_statement_node);
@@ -1929,18 +1913,16 @@
       if (!parse_expression(tmpl, closing)) {
         return false;
       }
-
     } else if (tok.text == static_cast<decltype(tok.text)>("endfor")) {
       if (for_statement_stack.empty()) {
         throw_parser_error("endfor without matching for");
       }
 
-      auto &for_statement_data = for_statement_stack.top();
+      auto& for_statement_data = for_statement_stack.top();
       get_next_token();
 
       current_block = for_statement_data->parent;
       for_statement_stack.pop();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("include")) {
       get_next_token();
 
@@ -1950,7 +1932,6 @@
       current_block->nodes.emplace_back(std::make_shared<IncludeStatementNode>(template_name, tok.text.data() - tmpl.content.c_str()));
 
       get_next_token();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("extends")) {
       get_next_token();
 
@@ -1960,7 +1941,6 @@
       current_block->nodes.emplace_back(std::make_shared<ExtendsStatementNode>(template_name, tok.text.data() - tmpl.content.c_str()));
 
       get_next_token();
-
     } else if (tok.text == static_cast<decltype(tok.text)>("set")) {
       get_next_token();
 
@@ -1983,14 +1963,13 @@
       if (!parse_expression(tmpl, closing)) {
         return false;
       }
-
     } else {
       return false;
     }
     return true;
   }
 
-  void parse_into(Template &tmpl, std::string_view path) {
+  void parse_into(Template& tmpl, std::string_view path) {
     lexer.start(tmpl.content);
     current_block = &tmpl.root;
 
@@ -2004,7 +1983,8 @@
         if (!for_statement_stack.empty()) {
           throw_parser_error("unmatched for");
         }
-      } return;
+      }
+        return;
       case Token::Kind::Text: {
         current_block->nodes.emplace_back(std::make_shared<TextNode>(tok.text.data() - tmpl.content.c_str(), tok.text.size()));
       } break;
@@ -2054,11 +2034,10 @@
     }
   }
 
-
 public:
-  explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config,
-                  TemplateStorage& template_storage, const FunctionStorage& function_storage)
-      : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) { }
+  explicit Parser(const ParserConfig& parser_config, const LexerConfig& lexer_config, TemplateStorage& template_storage,
+                  const FunctionStorage& function_storage)
+      : config(parser_config), lexer(lexer_config), template_storage(template_storage), function_storage(function_storage) {}
 
   Template parse(std::string_view input, std::string_view path) {
     auto result = Template(static_cast<std::string>(input));
@@ -2119,7 +2098,7 @@
 /*!
  * \brief Class for rendering a Template with data.
  */
-class Renderer : public NodeVisitor  {
+class Renderer : public NodeVisitor {
   using Op = FunctionStorage::Operation;
 
   const RenderConfig config;
@@ -2205,8 +2184,7 @@
     data_eval_stack.push(result_ptr.get());
   }
 
-  template<size_t N, size_t N_start = 0, bool throw_not_found=true>
-  std::array<const json*, N> get_arguments(const FunctionNode& node) {
+  template <size_t N, size_t N_start = 0, bool throw_not_found = true> std::array<const json*, N> get_arguments(const FunctionNode& node) {
     if (node.arguments.size() < N_start + N) {
       throw_renderer_error("function needs " + std::to_string(N_start + N) + " variables, but has only found " + std::to_string(node.arguments.size()), node);
     }
@@ -2236,10 +2214,9 @@
     return result;
   }
 
-  template<bool throw_not_found=true>
-  Arguments get_argument_vector(const FunctionNode& node) {
+  template <bool throw_not_found = true> Arguments get_argument_vector(const FunctionNode& node) {
     const size_t N = node.arguments.size();
-    for (auto a: node.arguments) {
+    for (auto a : node.arguments) {
       a->accept(*this);
     }
 
@@ -2278,7 +2255,7 @@
     output_stream->write(current_template->content.c_str() + node.pos, node.length);
   }
 
-  void visit(const ExpressionNode&) { }
+  void visit(const ExpressionNode&) {}
 
   void visit(const LiteralNode& node) {
     data_eval_stack.push(&node.value);
@@ -2287,10 +2264,8 @@
   void visit(const DataNode& node) {
     if (additional_data.contains(node.ptr)) {
       data_eval_stack.push(&(additional_data[node.ptr]));
-
     } else if (data_input->contains(node.ptr)) {
       data_eval_stack.push(&(*data_input)[node.ptr]);
-
     } else {
       // Try to evaluate as a no-argument callback
       const auto function_data = function_storage.find_function(node.name, 0);
@@ -2299,7 +2274,6 @@
         const auto value = std::make_shared<json>(function_data.callback(empty_args));
         data_tmp_stack.push_back(value);
         data_eval_stack.push(value.get());
-
       } else {
         data_eval_stack.push(nullptr);
         not_found_stack.emplace(&node);
@@ -2426,12 +2400,12 @@
       make_result(get_arguments<1>(node)[0]->get<int>() % 2 == 0);
     } break;
     case Op::Exists: {
-      auto &&name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
+      auto&& name = get_arguments<1>(node)[0]->get_ref<const std::string&>();
       make_result(data_input->contains(json::json_pointer(DataNode::convert_dot_to_ptr(name))));
     } break;
     case Op::ExistsInObject: {
       const auto args = get_arguments<2>(node);
-      auto &&name = args[1]->get_ref<const std::string&>();
+      auto&& name = args[1]->get_ref<const std::string&>();
       make_result(args[0]->find(name) != args[0]->end());
     } break;
     case Op::First: {
@@ -2581,9 +2555,9 @@
     print_data(eval_expression_list(node));
   }
 
-  void visit(const StatementNode&) { }
+  void visit(const StatementNode&) {}
 
-  void visit(const ForStatementNode&) { }
+  void visit(const ForStatementNode&) {}
 
   void visit(const ForArrayStatementNode& node) {
     const auto result = eval_expression_list(node.condition);
@@ -2685,7 +2659,7 @@
   void visit(const ExtendsStatementNode& node) {
     const auto included_template_it = template_storage.find(node.file);
     if (included_template_it != template_storage.end()) {
-      const Template *parent_template = &included_template_it->second;
+      const Template* parent_template = &included_template_it->second;
       render_to(*output_stream, *parent_template, *data_input, &additional_data);
       break_rendering = true;
     } else if (config.throw_at_missing_includes) {
@@ -2701,7 +2675,7 @@
     if (block_it != current_template->block_storage.end()) {
       block_statement_stack.emplace_back(&node);
       block_it->second->block.accept(*this);
-      block_statement_stack.pop_back(); 
+      block_statement_stack.pop_back();
     }
     current_level = old_level;
     current_template = template_stack.back();
@@ -2716,7 +2690,7 @@
 
 public:
   Renderer(const RenderConfig& config, const TemplateStorage& template_storage, const FunctionStorage& function_storage)
-      : config(config), template_storage(template_storage), function_storage(function_storage) { }
+      : config(config), template_storage(template_storage), function_storage(function_storage) {}
 
   void render_to(std::ostream& os, const Template& tmpl, const json& data, json* loop_data = nullptr) {
     output_stream = &os;
@@ -2760,12 +2734,11 @@
   TemplateStorage template_storage;
 
 public:
-  Environment() : Environment("") {}
+  Environment(): Environment("") {}
 
-  explicit Environment(const std::string& global_path) : input_path(global_path), output_path(global_path) {}
+  explicit Environment(const std::string& global_path): input_path(global_path), output_path(global_path) {}
 
-  Environment(const std::string& input_path, const std::string& output_path)
-      : input_path(input_path), output_path(output_path) {}
+  Environment(const std::string& input_path, const std::string& output_path): input_path(input_path), output_path(output_path) {}
 
   /// Sets the opener and closer for template statements
   void set_statement(const std::string& open, const std::string& close) {
@@ -2837,7 +2810,9 @@
     return parse_template(filename);
   }
 
-  std::string render(std::string_view input, const json& data) { return render(parse(input), data); }
+  std::string render(std::string_view input, const json& data) {
+    return render(parse(input), data);
+  }
 
   std::string render(const Template& tmpl, const json& data) {
     std::stringstream os;
@@ -2866,8 +2841,7 @@
     file.close();
   }
 
-  void write_with_json_file(const std::string& filename, const std::string& filename_data,
-                            const std::string& filename_out) {
+  void write_with_json_file(const std::string& filename, const std::string& filename_data, const std::string& filename_out) {
     const json data = load_json(filename_data);
     write(filename, data, filename_out);
   }
@@ -2923,7 +2897,10 @@
   @brief Adds a void callback with given number or arguments
   */
   void add_void_callback(const std::string& name, int num_args, const VoidCallbackFunction& callback) {
-    function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
+    function_storage.add_callback(name, num_args, [callback](Arguments& args) {
+      callback(args);
+      return json();
+    });
   }
 
   /** Includes a template with a given name into the environment.
diff --git a/test/benchmark.cpp b/test/benchmark.cpp
index 2cfc07b..92c696f 100644
--- a/test/benchmark.cpp
+++ b/test/benchmark.cpp
@@ -3,7 +3,6 @@
 #include "hayai/hayai.hpp"
 #include <inja/inja.hpp>
 
-
 inja::Environment env;
 
 const std::string test_file_directory {"../test/data/benchmark/"};
@@ -13,11 +12,15 @@
 std::string medium_template = env.load_file(test_file_directory + "medium_template.txt");
 std::string large_template = env.load_file(test_file_directory + "large_template.txt");
 
-
-BENCHMARK(SmallDataMediumTemplate, render, 5, 30) { env.render(medium_template, small_data); }
-BENCHMARK(LargeDataMediumTemplate, render, 5, 15) { env.render(medium_template, large_data); }
-BENCHMARK(LargeDataLargeTemplate, render, 5, 5) { env.render(large_template, large_data); }
-
+BENCHMARK(SmallDataMediumTemplate, render, 5, 30) {
+  env.render(medium_template, small_data);
+}
+BENCHMARK(LargeDataMediumTemplate, render, 5, 15) {
+  env.render(medium_template, large_data);
+}
+BENCHMARK(LargeDataLargeTemplate, render, 5, 5) {
+  env.render(large_template, large_data);
+}
 
 int main() {
   hayai::ConsoleOutputter consoleOutputter;
diff --git a/test/test-files.cpp b/test/test-files.cpp
index 2de97fc..aa01cff 100644
--- a/test/test-files.cpp
+++ b/test/test-files.cpp
@@ -5,7 +5,9 @@
   inja::json data;
   data["name"] = "Jeff";
 
-  SUBCASE("Files should be loaded") { CHECK(env.load_file(test_file_directory + "simple.txt") == "Hello {{ name }}."); }
+  SUBCASE("Files should be loaded") {
+    CHECK(env.load_file(test_file_directory + "simple.txt") == "Hello {{ name }}.");
+  }
 
   SUBCASE("Files should be rendered") {
     CHECK(env.render_file(test_file_directory + "simple.txt", data) == "Hello Jeff.");
@@ -29,8 +31,7 @@
 
   for (std::string test_name : {"simple-file", "nested", "nested-line", "html", "html-extend"}) {
     SUBCASE(test_name.c_str()) {
-      CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") ==
-            env.load_file(test_name + "/result.txt"));
+      CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt"));
     }
   }
 
@@ -49,8 +50,7 @@
 
   for (std::string test_name : {"nested-whitespace"}) {
     SUBCASE(test_name.c_str()) {
-      CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") ==
-            env.load_file(test_name + "/result.txt"));
+      CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt"));
     }
   }
 }
@@ -73,7 +73,8 @@
   inja::Environment env {test_file_directory};
   env.set_search_included_templates_in_files(false);
 
-  CHECK_THROWS_WITH(env.render_file_with_json_file("html/template.txt", "html/data.json"), "[inja.exception.render_error] (at 3:14) include 'header.txt' not found");
+  CHECK_THROWS_WITH(env.render_file_with_json_file("html/template.txt", "html/data.json"),
+                    "[inja.exception.render_error] (at 3:14) include 'header.txt' not found");
 }
 
 TEST_CASE("include-in-memory-and-file-template") {
diff --git a/test/test-functions.cpp b/test/test-functions.cpp
index 92eca89..667f553 100644
--- a/test/test-functions.cpp
+++ b/test/test-functions.cpp
@@ -56,8 +56,8 @@
   SUBCASE("length") {
     CHECK(env.render("{{ length(names) }}", data) == "4"); // Length of array
     CHECK(env.render("{{ length(name) }}", data) == "5");  // Length of string
-    // CHECK_THROWS_WITH( env.render("{{ length(5) }}", data), "[inja.exception.json_error]
-    // [json.exception.type_error.302] type must be array, but is number" );
+                                                           // CHECK_THROWS_WITH( env.render("{{ length(5) }}", data), "[inja.exception.json_error]
+                                                           // [json.exception.type_error.302] type must be array, but is number" );
   }
 
   SUBCASE("sort") {
@@ -150,8 +150,7 @@
     CHECK(env.render("{{ default(name, \"nobody\") }}", data) == "Peter");
     CHECK(env.render("{{ default(surname, \"nobody\") }}", data) == "nobody");
     CHECK(env.render("{{ default(surname, \"{{ surname }}\") }}", data) == "{{ surname }}");
-    CHECK_THROWS_WITH(env.render("{{ default(surname, lastname) }}", data),
-                      "[inja.exception.render_error] (at 1:21) variable 'lastname' not found");
+    CHECK_THROWS_WITH(env.render("{{ default(surname, lastname) }}", data), "[inja.exception.render_error] (at 1:21) variable 'lastname' not found");
   }
 
   SUBCASE("exists") {
@@ -159,7 +158,7 @@
     CHECK(env.render("{{ exists(\"zipcode\") }}", data) == "false");
     CHECK(env.render("{{ exists(name) }}", data) == "false");
     CHECK(env.render("{{ exists(property) }}", data) == "true");
-    
+
     // CHECK(env.render("{{ exists(\"keywords\") and length(keywords) > 0 }}", data) == "false");
   }
 
@@ -168,10 +167,8 @@
     CHECK(env.render("{{ existsIn(brother, \"parents\") }}", data) == "false");
     CHECK(env.render("{{ existsIn(brother, property) }}", data) == "true");
     CHECK(env.render("{{ existsIn(brother, name) }}", data) == "false");
-    CHECK_THROWS_WITH(env.render("{{ existsIn(sister, \"lastname\") }}", data),
-                      "[inja.exception.render_error] (at 1:13) variable 'sister' not found");
-    CHECK_THROWS_WITH(env.render("{{ existsIn(brother, sister) }}", data),
-                      "[inja.exception.render_error] (at 1:22) variable 'sister' not found");
+    CHECK_THROWS_WITH(env.render("{{ existsIn(sister, \"lastname\") }}", data), "[inja.exception.render_error] (at 1:13) variable 'sister' not found");
+    CHECK_THROWS_WITH(env.render("{{ existsIn(brother, sister) }}", data), "[inja.exception.render_error] (at 1:22) variable 'sister' not found");
   }
 
   SUBCASE("join") {
@@ -212,7 +209,7 @@
   inja::json data;
   data["age"] = 28;
 
-  env.add_callback("double", 1, [](inja::Arguments &args) {
+  env.add_callback("double", 1, [](inja::Arguments& args) {
     int number = args.at(0)->get<int>();
     return 2 * number;
   });
@@ -244,7 +241,7 @@
   });
 
   env.add_void_callback("log", 1, [](inja::Arguments) {
-    
+
   });
 
   env.add_callback("multiply", 0, [](inja::Arguments) { return 1.0; });
@@ -262,7 +259,7 @@
 
   SUBCASE("Variadic") {
     env.add_callback("argmax", [](inja::Arguments& args) {
-      auto result = std::max_element(args.begin(), args.end(), [](const inja::json* a, const inja::json* b) { return *a < *b;});
+      auto result = std::max_element(args.begin(), args.end(), [](const inja::json* a, const inja::json* b) { return *a < *b; });
       return std::distance(args.begin(), result);
     });
 
diff --git a/test/test-renderer.cpp b/test/test-renderer.cpp
index 2801ed0..2089791 100644
--- a/test/test-renderer.cpp
+++ b/test/test-renderer.cpp
@@ -50,25 +50,20 @@
   SUBCASE("loops") {
     CHECK(env.render("{% for name in names %}a{% endfor %}", data) == "aa");
     CHECK(env.render("Hello {% for name in names %}{{ name }} {% endfor %}!", data) == "Hello Jeff Seb !");
-    CHECK(env.render("Hello {% for name in names %}{{ loop.index }}: {{ name }}, {% endfor %}!", data) ==
-          "Hello 0: Jeff, 1: Seb, !");
+    CHECK(env.render("Hello {% for name in names %}{{ loop.index }}: {{ name }}, {% endfor %}!", data) == "Hello 0: Jeff, 1: Seb, !");
     CHECK(env.render("{% for type, name in relatives %}{{ loop.index1 }}: {{ type }}: {{ name }}{% if loop.is_last == "
                      "false %}, {% endif %}{% endfor %}",
                      data) == "1: brother: Chris, 2: mother: Maria, 3: sister: Jenny");
     CHECK(env.render("{% for v in vars %}{% if v > 0 %}+{% endif %}{% endfor %}", data) == "+++");
-    CHECK(env.render(
-              "{% for name in names %}{{ loop.index }}: {{ name }}{% if not loop.is_last %}, {% endif %}{% endfor %}!",
-              data) == "0: Jeff, 1: Seb!");
+    CHECK(env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if not loop.is_last %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!");
     CHECK(env.render("{% for name in names %}{{ loop.index }}: {{ name }}{% if loop.is_last == false %}, {% endif %}{% "
                      "endfor %}!",
                      data) == "0: Jeff, 1: Seb!");
 
     CHECK(env.render("{% for name in [] %}a{% endfor %}", data) == "");
 
-    CHECK_THROWS_WITH(env.render("{% for name ins names %}a{% endfor %}", data),
-                      "[inja.exception.parser_error] (at 1:13) expected 'in', got 'ins'");
-    CHECK_THROWS_WITH(env.render("{% for name in empty_loop %}a{% endfor %}", data),
-                      "[inja.exception.render_error] (at 1:16) variable 'empty_loop' not found");
+    CHECK_THROWS_WITH(env.render("{% for name ins names %}a{% endfor %}", data), "[inja.exception.parser_error] (at 1:13) expected 'in', got 'ins'");
+    CHECK_THROWS_WITH(env.render("{% for name in empty_loop %}a{% endfor %}", data), "[inja.exception.render_error] (at 1:16) variable 'empty_loop' not found");
     // CHECK_THROWS_WITH( env.render("{% for name in relatives %}{{ name }}{% endfor %}", data),
     // "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is object" );
   }
@@ -112,12 +107,10 @@
     CHECK(env.render("{% if age >= 30 %}Right{% else %}Wrong{% endif %}", data) == "Wrong");
     CHECK(env.render("{% if age in [28, 29, 30] %}True{% endif %}", data) == "True");
     CHECK(env.render("{% if age == 28 %}28{% else if age == 29 %}29{% endif %}", data) == "29");
-    CHECK(env.render("{% if age == 26 %}26{% else if age == 27 %}27{% else if age == 28 %}28{% else %}29{% endif %}",
-                     data) == "29");
+    CHECK(env.render("{% if age == 26 %}26{% else if age == 27 %}27{% else if age == 28 %}28{% else %}29{% endif %}", data) == "29");
     CHECK(env.render("{% if age == 25 %}+{% endif %}{% if age == 29 %}+{% else %}-{% endif %}", data) == "+");
 
-    CHECK_THROWS_WITH(env.render("{% if is_happy %}{% if is_happy %}{% endif %}", data),
-                      "[inja.exception.parser_error] (at 1:46) unmatched if");
+    CHECK_THROWS_WITH(env.render("{% if is_happy %}{% if is_happy %}{% endif %}", data), "[inja.exception.parser_error] (at 1:46) unmatched if");
     CHECK_THROWS_WITH(env.render("{% if is_happy %}{% else if is_happy %}{% end if %}", data),
                       "[inja.exception.parser_error] (at 1:43) expected statement, got 'end'");
   }
@@ -128,8 +121,7 @@
     CHECK(env.render("{% set age=30 %}{{age}}", data) == "30");
     CHECK(env.render("{% set predefined.value=1 %}{% if existsIn(predefined, \"value\") %}{{predefined.value}}{% endif %}", data) == "1");
     CHECK(env.render("{% set brother.name=\"Bob\" %}{{brother.name}}", data) == "Bob");
-    CHECK_THROWS_WITH(env.render("{% if predefined %}{% endif %}", data),
-                      "[inja.exception.render_error] (at 1:7) variable 'predefined' not found");
+    CHECK_THROWS_WITH(env.render("{% if predefined %}{% endif %}", data), "[inja.exception.render_error] (at 1:7) variable 'predefined' not found");
     CHECK(env.render("{{age}}", data) == "29");
     CHECK(env.render("{{brother.name}}", data) == "Chris");
   }
@@ -181,31 +173,24 @@
 
     inja::Template t2 = env.parse("{% include \"greeting\" %}!");
     CHECK(env.render(t2, data) == "Hello Peter!");
-    CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"),
-                      "[inja.exception.file_error] failed accessing file at 'does-not-exist'");
+    CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"), "[inja.exception.file_error] failed accessing file at 'does-not-exist'");
 
-    CHECK_THROWS_WITH(env.parse("{% include does-not-exist %}!"),
-                      "[inja.exception.parser_error] (at 1:12) expected string, got 'does-not-exist'");
+    CHECK_THROWS_WITH(env.parse("{% include does-not-exist %}!"), "[inja.exception.parser_error] (at 1:12) expected string, got 'does-not-exist'");
   }
 
   SUBCASE("include-callback") {
     inja::Environment env;
 
-    CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"),
-                      "[inja.exception.file_error] failed accessing file at 'does-not-exist'");
+    CHECK_THROWS_WITH(env.parse("{% include \"does-not-exist\" %}!"), "[inja.exception.file_error] failed accessing file at 'does-not-exist'");
 
     env.set_search_included_templates_in_files(false);
-    env.set_include_callback([&env](const std::string&, const std::string&) {
-      return env.parse("Hello {{ name }}");
-    });
+    env.set_include_callback([&env](const std::string&, const std::string&) { return env.parse("Hello {{ name }}"); });
 
     inja::Template t1 = env.parse("{% include \"greeting\" %}!");
     CHECK(env.render(t1, data) == "Hello Peter!");
 
     env.set_search_included_templates_in_files(true);
-    env.set_include_callback([&env](const std::string&, const std::string& name) {
-      return env.parse("Bye " + name);
-    });
+    env.set_include_callback([&env](const std::string&, const std::string& name) { return env.parse("Bye " + name); });
 
     inja::Template t2 = env.parse("{% include \"Jeff\" %}!");
     CHECK(env.render(t2, data) == "Bye Jeff!");
@@ -218,8 +203,7 @@
     inja::Environment env;
     env.include_template("city.tpl", env.parse("{{ loop.index }}:{{ city.name }};"));
 
-    CHECK(env.render("{% for city in cities %}{% include \"city.tpl\" %}{% endfor %}", loop_data) ==
-          "0:Munich;1:New York;");
+    CHECK(env.render("{% for city in cities %}{% include \"city.tpl\" %}{% endfor %}", loop_data) == "0:Munich;1:New York;");
   }
 
   SUBCASE("count variables") {
diff --git a/test/test-units.cpp b/test/test-units.cpp
index 2366dde..bbef190 100644
--- a/test/test-units.cpp
+++ b/test/test-units.cpp
@@ -27,7 +27,7 @@
 
 TEST_CASE("copy environment") {
   inja::Environment env;
-  env.add_callback("double", 1, [](inja::Arguments &args) {
+  env.add_callback("double", 1, [](inja::Arguments& args) {
     int number = args.at(0)->get<int>();
     return 2 * number;
   });