==================
Simple function
==================

fn hello() {
    42
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters)
    body: (block
      (integer_literal))))

==================
Public function with parameters
==================

pub fn add(a, b) {
    a + b
}

---

(source_file
  (function_item
    (visibility_modifier)
    name: (identifier)
    parameters: (parameters
      (identifier)
      (identifier))
    body: (block
      (binary_expression
        left: (identifier)
        right: (identifier)))))

==================
Async function
==================

async fn fetch(url) {
    let data = http::get(url).await;
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters
      (identifier))
    body: (block
      (let_declaration
        pattern: (identifier)
        value: (await_expression
          (call_expression
            function: (scoped_identifier
              path: (identifier)
              name: (identifier))
            arguments: (arguments
              (identifier))))))))

==================
Use declaration
==================

use owlry::Item;

---

(source_file
  (use_declaration
    argument: (scoped_identifier
      path: (identifier)
      name: (identifier))))

==================
Struct with named fields
==================

struct Point { x, y }

---

(source_file
  (struct_item
    name: (type_identifier)
    body: (field_declaration_list
      (field_identifier)
      (field_identifier))))

==================
Tuple struct
==================

struct Pair(a, b);

---

(source_file
  (struct_item
    name: (type_identifier)
    body: (ordered_field_declaration_list
      (identifier)
      (identifier))))

==================
Unit struct
==================

struct Empty;

---

(source_file
  (struct_item
    name: (type_identifier)))

==================
Enum with unit variants
==================

enum Color { Red, Green, Blue }

---

(source_file
  (enum_item
    name: (type_identifier)
    body: (enum_variant_list
      (enum_variant
        name: (identifier))
      (enum_variant
        name: (identifier))
      (enum_variant
        name: (identifier)))))

==================
Enum with tuple variants
==================

enum Result { Ok(value), Err(msg) }

---

(source_file
  (enum_item
    name: (type_identifier)
    body: (enum_variant_list
      (enum_variant
        name: (identifier)
        body: (ordered_field_declaration_list
          (identifier)))
      (enum_variant
        name: (identifier)
        body: (ordered_field_declaration_list
          (identifier))))))

==================
Let declaration
==================

fn main() {
    let items = [];
}

---

(source_file
  (function_item
    name: (identifier)
    parameters: (parameters)
    body: (block
      (let_declaration
        pattern: (identifier)
        value: (array_expression)))))
