# Generated CLib Headers

```{caution}
The YAML configuration for the **sourcegen** utility is an experimental part of Cantera
and may be changed without notice.
```

The folder `interfaces/sourcegen/src/sourcegen/headers` holds YAML configuration files
for code generation. Code generation uses output of the
[Doxygen](https://www.doxygen.org) code documentation tool for information on function
declarations as well as C++ docstrings. The collected information
represents annotated CLib functions that form the basis for specific APIs generated by
[sourcegen](sourcegen).

(sec-sourcegen-specifications)=
## Header Specification Files

Each YAML file contains information for CLib headers that implement functions and
methods built around a specific Cantera class. The following fields are supported:

- `docstring`: Used as part of the docstring of the generated API file.
- `prefix`: Prefix used for CLib functions.
- `base`: Base class of the CLib library; examples: `Solution`, `ThermoPhase`.
    Stand-alone functions defined in the `Cantera` namespace use `""` as a base.
- `parents`: List of class parents; used to locate C++ methods (default: `[]`).
- `derived`: Dictionary of derived classes and alternative prefixes. Used to locate C++
    methods and to better differentiate CLib method names (default: `{}`).
- `recipes`: List of CLib *recipes* (see below).

(sec-sourcegen-function-types)=
## CLib Function Types

The *sourcegen* utility implements logic to automatically detect CLib functions types
based on a recipe, which is subsequently used to scaffold API functions using dedicated
*Jinja* templates. The following recipe/CLib function types are differentiated:

- `function`: Regular function defined in the `Cantera` namespace.
- `constructor`: A CLib constructor adds new C++ objects to CLib storage. Constructor
    names should start with `new`. As all objects are handled via smart `shared_ptr<>`,
    CLib constructors require C++ utility functions that return a pointer to a new
    object. Constructors with the name `new` will use the C++ default constructor.
- `accessor`: A CLib accessor adds existing or spawned C++ objects to CLib storage.
- `destructor`: A CLib destructor removes a C++ object from CLib. Destructor names
    should start with `del`.
- `getter`: Implements a getter method of a C++ class.
- `setter`: Implements a setter method of a C++ class.
- `method`: Generic method of a C++ class.
- `variable-getter`: Implements a getter for a C++ class member variable or a variable
    defined in the `Cantera` namespace. Functionality is inferred automatically.
- `variable-setter`: Implements a getter for a C++ class member variable or a variable
    defined in the `Cantera` namespace. Field disambiguates from a `variable-getter`.
- `noop`: No operation.
- `reserved`: Reserved (hard-coded) CLib functions which include service functions for
    CLib storage (examples: `cabinetSize`, `parentHandle`) or functions that do not have
    a C++ equivalent (example: `getCanteraError`).

(sec-sourcegen-recipes)=
## Function Recipes

Recipes include all information required for the auto-generation of a corresponding
CLib function. Each YAML recipe uses the following fields:

- `name`: Name of the CLib function to be generated (without prefix).
- `brief`: Optional override for brief description from Doxygen documentation.
- `what`: Optional override for auto-detected recipe/CLib function type.
- `wraps`: Optional name or signature of the implemented C++ function/method or
    variable. If left empty, *sourcegen* searches for Doxygen tags matching the `name`
    field. A name is sufficient if C++ functions/methods are unique, for example
    `Func1::type`. A signature is required whenever shortened signatures with default
    arguments are used and/or multiple C++ function/method variants exist, for example
    `Phase::moleFraction(size_t)`. The scope (part preceding `::`) may be omitted, as
    it can be inferred based on the fields `base`, `parents` or `derived`.
- `uses`: Optional list of auxiliary C++ class methods used by the CLib function. The
    exact usage depends on the type of the implemented CLib function.

For custom code, additional fields are required to replace generated information:

- `declaration`: Full CLib declaration.
- `parameters`: Mapping of parameter doc-strings.
- `returns`: Return doc-string.
- `code`: Custom code to be executed.

(sec-sourcegen-headers)=
## CLib Header Generator

The CLib header generator is located in the `interfaces/sourcegen/src/sourcegen/headers`
folder.

### Configuration

The YAML file `config.yaml` within the `headers` folder contains configuration options
specific to the CLib interface. Configuration options are static unless new CLib
modules need to be implemented (see section [](sec-sourcegen-clib-extend)).

- **Generic Options:** As the CLib interface follows directly from
  [](sec-sourcegen-specifications), override options defined by `ignore_files` and
  `ignore_funcs` are not needed. While the options are available, they should only be
  used for testing purposes and otherwise be left at their default values (empty).

- **Type Crosswalks:** These fields map C++ types to their CLib equivalents.

    - `ret_type_crosswalk`: Specifies the types returned by C++ functions and methods.
    - `par_type_crosswalk`: Specifies the types passed as parameters in C++ functions
      and methods.

(sec-sourcegen-headers-details)=
### Implementation Details

- **Header Specification Files:** Definitions used for the CLib API.

    - `ct*_auto.yaml`: Files specifying CLib interfaces for specific Cantera C++
      classes. See [](sec-sourcegen-specifications).

- **Templates for Scaffolding:** Templates, powered by
  [Jinja](https://jinja.palletsprojects.com), are used to scaffold elements of the CLib
  API. The following files define these templates:

    - `templates.yaml`: Defines code blocks within the header files.

- **Source Code:** The implementation of the CLib header generator is contained in
  `generator.py`.

## Extending the CLib Header API

See [](sec-sourcegen-clib-extend).
